0

I want to execute my maven project standalone class using command line.

JnetSampleTest.java -

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.jnetpcap.Pcap;
import org.jnetpcap.PcapIf;
import org.jnetpcap.packet.PcapPacket;
import org.jnetpcap.packet.PcapPacketHandler;

public class JnetSampleTest {

    public static void main(String[] args) {

        List<PcapIf> alldevs = new ArrayList<PcapIf>(); // Will be filled with NICs
        StringBuilder errbuf = new StringBuilder(); // For any error msgs

        int r = Pcap.findAllDevs(alldevs, errbuf);
        if (r == Pcap.NOT_OK || alldevs.isEmpty()) {
            System.err.printf("Can't read list of devices, error is %s", errbuf.toString());
            return;
        }

        System.out.println("Network devices found:");

        int i = 0;
        for (PcapIf device : alldevs) {
            String description = (device.getDescription() != null) ? device.getDescription()
                    : "No description available";
            System.out.printf("#%d: %s [%s]\n", i++, device.getName(), description);
        }

        PcapIf device = alldevs.get(8); // We know we have atleast 1 device
        PcapIf d = new PcapIf();

        System.out.printf("\nChoosing '%s' on your behalf:\n",
                (device.getDescription() != null) ? device.getDescription() : device.getName());

        int snaplen = 64 * 1024; // Capture all packets, no trucation
        int flags = Pcap.MODE_PROMISCUOUS; // capture all packets
        int timeout = 10 * 1000; // 10 seconds in millis
        Pcap pcap = Pcap.openLive(device.getName(), snaplen, flags, timeout, errbuf);

        if (pcap == null) {
            System.err.printf("Error while opening device for capture: " + errbuf.toString());
            return;
        }

        PcapPacketHandler<String> jpacketHandler = new PcapPacketHandler<String>() {
            public void nextPacket(PcapPacket packet, String user) {
                System.out.printf("Received packet at %s caplen=%-4d len=%-4d %s\n",
                        new Date(packet.getCaptureHeader().timestampInMillis()), packet.getCaptureHeader().caplen(), // Length
                        packet.getCaptureHeader().wirelen(), // Original length
                        user // User supplied object
                );
            }
        };

        pcap.loop(10, jpacketHandler, "jNetPcap rocks!");
        pcap.close();
    }
}

I created user library for jnetpcap by following this tutorial and added it to project.

In eclipse this code is running fine but I want to execute this code using command line so I added below sample code in pom.xml -

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.2.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>java</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>com.JnetSampleTest.JnetSampleTest</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

I tried this command to execute my main class -

mvn exec:java -Dexec.mainClass="com.JnetSampleTest.JnetSampleTest"

I'm getting this exception -

[WARNING] 
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.UnsatisfiedLinkError: com.slytechs.library.NativeLibrary.dlopen(Ljava/lang/String;)J
    at com.slytechs.library.NativeLibrary.dlopen(Native Method)
    at com.slytechs.library.NativeLibrary.<init>(Unknown Source)
    at com.slytechs.library.JNILibrary.<init>(Unknown Source)
    at com.slytechs.library.JNILibrary.loadLibrary(Unknown Source)
    at com.slytechs.library.JNILibrary.register(Unknown Source)
    at com.slytechs.library.JNILibrary.register(Unknown Source)
    at com.slytechs.library.JNILibrary.register(Unknown Source)
    at org.jnetpcap.Pcap.<clinit>(Unknown Source)

How I can execute this class using command line?

Honza Zidek
  • 9,204
  • 4
  • 72
  • 118
ketan
  • 2,732
  • 11
  • 34
  • 80
  • Go through this [link](http://jnetpcap.com/node/953), it points out to what could be causing this issue. Also go through this [SO question](https://stackoverflow.com/questions/39048964/jnetpcap-java-lang-unsatisfiedlinkerror-com-slytechs-library-nativelibrary-dl). – Sadiq Ali Jul 21 '17 at 06:37

2 Answers2

0

The native library is missing. Could be a x86 vs. x64 issue.

fhossfel
  • 2,041
  • 16
  • 24
  • @fhossfel- I kept native libjnetpcap.so library under project directory/lib/ directory and provided path for native library to created user library. – ketan Jul 21 '17 at 06:38
  • How did you provide the patch. Did you set java.library.path? – fhossfel Jul 21 '17 at 06:55
  • @fhossfel- I tried with setting -Djava.library.path and while creating user library I give lib folder path. please see https://stackoverflow.com/questions/45220894/how-to-execute-maven-main-class-with-required-user-libraries/ question for more details. – ketan Jul 21 '17 at 06:58
0

this type of error occurs, when the so/dll file that the code is looking for is not found. please ensure you have the .dll file for jnetpcap saved in the windows system32 folder.

The process for IntelliJ should be similar to that on jnetpcap.com/?q=eclipse (or for NetBeans). I'm not familiar with IntelliJ, but ... you could just try copying the native library (.so file on linux, .dll file on windows, .dylib file on Mac) into the main directory of your project.

Anshul Sharma
  • 3,432
  • 1
  • 12
  • 17
  • I already provided .so file in user library and added user library to project. I know .so file is not get founded but why it is so? – ketan Jul 21 '17 at 06:59