如何使用所需的用户库执行 maven main class?
How to execute maven main class with required user libraries?
我创建了一个maven项目,其中只有一个class可用。我想在这个 class 中使用 jnetpcap API。为此,我按照 jnet eclipse setup 教程中的设置 1 方法(用户库)创建了一个用户库并将其添加到我的项目中。
JnetTest.java - 这个class和jnetpcap clasic example
一样
我的系统是Ubuntu16.10.
我使用的是 openjdk 版本“1.8.0_131”。
库创建步骤 -
- 我下载了jnetpcap的1.3版本jar包、源码包和javadoc包,添加了libjnetpcap.so、jnetpcap.jar、jnetpcap-src-1.3.zip、 jnetpcap-javadoc-1.3.zip 到主项目文件夹下创建的 lib 文件夹。
- 创建了新库。 Java-> Build Path -> User Libraries -> New -> Give Any Name.
- 添加jar文件。添加外部 jars -> 工作区单选按钮 -> selected lib/jnetpcap.jar
- 满足所需的依赖关系。展开 jar -> source -> edit -> selected lib/jnetpcap-src-1.3.zip。 javadoc -> 编辑 -> selected lib/jnetpcap-javadoc-1.3.zip。本机库位置 -> 编辑 -> selected lib 目录。 -> 申请 -> 确定
- 将库添加到项目中。右击项目 -> Build Path -> Configure Build Path -> Libraries -> Add Library -> User Library -> select new created library.
注意 - 我没有在我的 main class 中添加 vm 参数。即 -Djava.library.path="location to parent directory of .so file"
之后,我右键单击我的项目并单击 运行 作为 java 应用程序。这将在 eclipse 中正常工作。
实际问题-我想运行这个maven项目在一台不同的机器上只用命令行。我如何使用命令行 运行 这个项目?
我的做法-
我在 pom.xml 中添加了以下插件用于主要 class 配置。
<!-- 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>
我使用 mvn exec 命令 运行 我的主要 class
mvn exec:java -Dexec.mainClass="com.example.Main"
但我遇到了以下异常 -
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)
我的方法是否正确执行我的项目的 main class?如果是,那么我的问题的解决方案是什么?如果否,请提出有用的方法。
我没有你的确切代码,但我想你正在寻找这个。
http://www.mojohaus.org/exec-maven-plugin/examples/example-exec-using-plugin-dependencies.html
下面标记的部分是您可以放置主要 class 所需的依赖项的部分。我希望这有效。
<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>
JnetPcap 要求您在项目中引用两个库:
- JAR 文件包含您可以在代码中使用的 Java 接口 (jnetpcap.jar)
- 向 Java 库(即 libjnetpcap.so 或 jnetpcap.dll)公开 OS 特定函数的本机库
您看到的异常表明您在 运行 时缺少 #2。在这种情况下,您有两个选项可以使库可供您的应用程序使用:
您可以通过回显 $PATH
系统变量来找出您在 Ubuntu 上的路径上的目录:
> echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
只需将本机库复制到系统路径中已包含的目录中即可。
或者,您可以使用 java.library.path
参数将库的位置传递给 Java。假设库位于您的 Maven 项目目录中名为 lib
的目录中,请使用以下配置:
<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>
要执行此操作,只需 运行:
mvn exec:exec
我创建了一个maven项目,其中只有一个class可用。我想在这个 class 中使用 jnetpcap API。为此,我按照 jnet eclipse setup 教程中的设置 1 方法(用户库)创建了一个用户库并将其添加到我的项目中。
JnetTest.java - 这个class和jnetpcap clasic example
一样我的系统是Ubuntu16.10.
我使用的是 openjdk 版本“1.8.0_131”。
库创建步骤 -
- 我下载了jnetpcap的1.3版本jar包、源码包和javadoc包,添加了libjnetpcap.so、jnetpcap.jar、jnetpcap-src-1.3.zip、 jnetpcap-javadoc-1.3.zip 到主项目文件夹下创建的 lib 文件夹。
- 创建了新库。 Java-> Build Path -> User Libraries -> New -> Give Any Name.
- 添加jar文件。添加外部 jars -> 工作区单选按钮 -> selected lib/jnetpcap.jar
- 满足所需的依赖关系。展开 jar -> source -> edit -> selected lib/jnetpcap-src-1.3.zip。 javadoc -> 编辑 -> selected lib/jnetpcap-javadoc-1.3.zip。本机库位置 -> 编辑 -> selected lib 目录。 -> 申请 -> 确定
- 将库添加到项目中。右击项目 -> Build Path -> Configure Build Path -> Libraries -> Add Library -> User Library -> select new created library.
注意 - 我没有在我的 main class 中添加 vm 参数。即 -Djava.library.path="location to parent directory of .so file"
之后,我右键单击我的项目并单击 运行 作为 java 应用程序。这将在 eclipse 中正常工作。
实际问题-我想运行这个maven项目在一台不同的机器上只用命令行。我如何使用命令行 运行 这个项目?
我的做法-
我在 pom.xml 中添加了以下插件用于主要 class 配置。
<!-- 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>
我使用 mvn exec 命令 运行 我的主要 class
mvn exec:java -Dexec.mainClass="com.example.Main"
但我遇到了以下异常 -
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)
我的方法是否正确执行我的项目的 main class?如果是,那么我的问题的解决方案是什么?如果否,请提出有用的方法。
我没有你的确切代码,但我想你正在寻找这个。
http://www.mojohaus.org/exec-maven-plugin/examples/example-exec-using-plugin-dependencies.html
下面标记的部分是您可以放置主要 class 所需的依赖项的部分。我希望这有效。
<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>
JnetPcap 要求您在项目中引用两个库:
- JAR 文件包含您可以在代码中使用的 Java 接口 (jnetpcap.jar)
- 向 Java 库(即 libjnetpcap.so 或 jnetpcap.dll)公开 OS 特定函数的本机库
您看到的异常表明您在 运行 时缺少 #2。在这种情况下,您有两个选项可以使库可供您的应用程序使用:
您可以通过回显 $PATH
系统变量来找出您在 Ubuntu 上的路径上的目录:
> echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
只需将本机库复制到系统路径中已包含的目录中即可。
或者,您可以使用 java.library.path
参数将库的位置传递给 Java。假设库位于您的 Maven 项目目录中名为 lib
的目录中,请使用以下配置:
<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>
要执行此操作,只需 运行:
mvn exec:exec