我创建了一个 Maven 项目,其中只有一个类可用。我想在这个类中使用 jnetpcap API。为此,我遵循了jnet eclipse 设置使用设置 1 方法(用户库)的教程并创建了一个用户库并将其添加到我的项目中。
JnetTest.java -这个类与jnetpcap 经典示例
我的系统是Ubuntu 16.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->构建路径->用户库->新建->给出任意名称。
- 添加jar文件。添加外部 jar -> 工作区单选按钮 -> 选择 lib/jnetpcap.jar
- 满足所需的依赖关系。展开 jar -> 源 -> 编辑 -> 选择 lib/jnetpcap-src-1.3.zip。 javadoc -> 编辑 -> 选择 lib/jnetpcap-javadoc-1.3.zip。本机库位置 -> 编辑 -> 选定的 lib 目录。 -> 应用 -> 确定
- 将库添加到项目中。右键单击项目 -> 构建路径 -> 配置构建路径 -> 库 -> 添加库 -> 用户库 -> 选择新创建的库。
Note -我没有将 vm 参数添加到我的主类中。即 -Djava.library.path=".so 文件的父目录的位置"
之后,我右键单击我的项目,然后单击“作为 java 应用程序运行”。这在 eclipse 中可以正常工作。
实际问题-我想仅使用命令行在一台不同的机器上运行这个 Maven 项目。如何使用命令行运行这个项目?
我的做法——
-
我在 pom.xml 中添加了以下插件用于主类配置。
<!-- 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 命令来运行我的主类
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)
我的方法是否正确执行我的项目的主类?如果是的话,我的问题的解决方案是什么?如果没有,请建议有用的方法。
JnetPcap 要求您在项目中引用两个库:
- 包含可在代码中使用的 Java 接口的 JAR 文件 (jnetpcap.jar)
- 将操作系统特定功能公开给 Java 库的本机库(即 libjnetpcap.so 或 jnetpcap.dll)
您看到的异常表明您在运行时缺少#2。在这种情况下,您有两个选项可以使该库可供您的应用程序使用:
您可以通过回显以下命令来找出 Ubuntu 上的路径上有哪些目录$PATH
系统变量:
> echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
只需将本机库复制到系统路径中已包含的目录中即可。
或者,您可以使用以下方式传递图书馆的位置java.library.path
Java 的参数。假设该库位于名为的目录中lib
在您的 Maven 项目目录中,使用以下配置:
<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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)