小编典典

如何使用所需的用户库执行Maven主类?

java

我创建了一个maven项目,其中只有一个类可用。我想在此类中使用jnetpcap API。为此,我遵循了带有设置1方法(用户库)的jnet
eclipse设置
教程,并创建了一个用户库并将其添加到我的项目中。

JnetTest.java-
此类与jnetpcap经典示例相同

我的系统是Ubuntu 16.10。

我正在使用openjdk版本“ 1.8.0_131”。

库创建步骤-

  1. 我下载了1.3版的jnetpcap的jar包,源包和javadoc包,并将libjnetpcap.so,jnetpcap.jar,jnetpcap-src-1.3.zip,jnetpcap-javadoc-1.3.zip添加到了在主项目文件夹下创建的lib文件夹中。
  2. 创建了新的库。Java->构建路径->用户库->新建->提供任何名称。
  3. 添加jar文件。添加外部jar->工作区单选按钮->选定的lib / jnetpcap.jar
  4. 完成所需的依赖关系。展开jar->源->编辑->选择lib / jnetpcap-src-1.3.zip。javadoc->编辑->选择lib / jnetpcap-javadoc-1.3.zip。本机库位置->编辑->选择的lib目录。->申请->确定
  5. 将库添加到项目。右键单击项目->构建路径->配置构建路径->库->添加库->用户库->选择新创建的库。

注意- 我没有在主类中添加vm参数。即-Djava.library.path =“。so文件的父目录的位置”

之后,我右键单击我的项目,然后单击以Java应用程序运行。这将在日食中正常工作。

实际问题- 我只想通过命令行在一台不同的机器上运行该Maven项目。如何使用命令行运行此项目?

我的方法-

  1. 我在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>
  1. 我用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)

我的方法是正确的还是不执行项目的主类?如果是,那么我的问题的解决方案是什么?如果没有,请提出有用的方法。


阅读 309

收藏
2020-11-26

共1个答案

小编典典

JnetPcap要求您在项目中引用两个库:

  1. 包含您可以从代码中使用的Java接口的JAR文件(jnetpcap.jar)
  2. 将操作系统特定功能公开给Java库的本机库(即libjnetpcap.so或jnetpcap.dll)

您看到的异常表明您在运行时缺少#2。在这种情况下,您有两个选择可使库对您的应用程序可用:

您可以通过回显$PATH系统变量来找出Ubuntu路径上的目录:

> echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

只需将本机库复制到系统路径中已包含的目录中即可。

另外,您可以使用java.library.pathJava 的参数传递库的位置。假设该库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
2020-11-26