Reputation: 2904
I created one maven project in which only one class is available. I want to use jnetpcap API in this class. For this purpose, I followed jnet eclipse setup tutorial with Setup 1 approach (user library) and created one user library and added it to my project.
JnetTest.java - This class is same as jnetpcap clasic example
My system is Ubuntu 16.10.
I'm using openjdk version "1.8.0_131".
Library creation steps -
Note - I didn't added vm argument to my main class. i.e. -Djava.library.path="location to parent directory of .so file"
After that I right click on my project and clicked on a run as a java application. This will work in eclipse fine.
Actual problem - I want to run this maven project on one different machine with command line only. How I can run this project using command line?
My approach -
I added below plugin in pom.xml for main class configuration.
<!-- language: lang-xml -->
<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.example.Main</mainClass>
</configuration>
</plugin>
I used mvn exec command to run my main class
mvn exec:java -Dexec.mainClass="com.example.Main"
But I got below exception -
Exception in thread "main" 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.(Unknown Source)
at com.slytechs.library.JNILibrary.(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.(Unknown Source)
My approach is correct or not to execute my project's main class? If yes then what will be the solution to my problem? If no please suggest useful approach.
Upvotes: 3
Views: 3310
Reputation: 2701
Your mistake is not specifying java.library.path
value to loading libraries from.
While the Ben Damer answer is working, there is another way to do it:
MAVEN_OPTS='-Djava.library.path=./lib/' mvn exec:java -Dexec.mainClass="com.example.Main"
This may be useful, for example, when you want to use mvnDebug
to debug you code.
Upvotes: 0
Reputation: 1036
JnetPcap requires you to reference two libraries in your project:
The exception that you are seeing indicates that you are missing #2 at runtime. In this case, you have two options to make the library available to your application:
You can find out which directories are on your path on Ubuntu by echoing the $PATH
system variable:
> echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
Simply copy the native library into a directory that is already included on the system path.
Alternatively, you can pass the location of the library using the java.library.path
argument to Java. Assuming the library is in a directory called lib
inside your maven project directory, use the following configuration:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<executable>java</executable>
<arguments>
<argument>-Djava.library.path=${project.basedir}/lib</argument>
<argument>-classpath</argument>
<classpath />
<argument>com.example.Main</argument>
</arguments>
</configuration>
</plugin>
To execute this, simply run:
mvn exec:exec
Upvotes: 1
Reputation: 1016
I don't have your exact code bu I think you are looking for this.
http://www.mojohaus.org/exec-maven-plugin/examples/example-exec-using-plugin-dependencies.html
Below marked section is the one where you can put dependencies required by your main class. I hope this works.
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
...
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<includeProjectDependencies>false</includeProjectDependencies>
<includePluginDependencies>true</includePluginDependencies>
<executableDependency>
<groupId>com.example.myproject</groupId>
<artifactId>mylib</artifactId>
</executableDependency>
<mainClass>com.example.Main</mainClass>
<arguments>
<argument>argument1</argument>
...
</arguments>
<systemProperties>
<systemProperty>
<key>myproperty</key>
<value>myvalue</value>
</systemProperty>
...
</systemProperties>
</configuration>
<!-- This is where you put dependencies needed for main class-->
<dependencies>
<dependency>
<groupId>com.example.myproject</groupId>
<artifactId>mylib</artifactId>
<version>1.3.5</version>
<type>jar</type>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
...
</project>
Upvotes: 1