当前位置: 首页 > 面试题库 >

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

钱远
2023-03-14
问题内容

我创建了一个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)

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


问题答案:

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


 类似资料:
  • 问题内容: 我正在尝试使用gcc从Ubuntu上的编译简单的C示例。我必须用作gcc的参数以包含所需的库吗? 问题答案: 如果您使用,等获取库(相对于从源构建库),则仅安装软件包还是 _也_安装了获取头文件?Linux软件包通常将运行时库与编译时标头分开。这样,只需要库来满足动态链接的人就不必安装不需要的标头。但是,由于您要进行开发,因此需要这些标头,因此也需要该包。

  • 问题内容: 我想从Go执行perforce命令行“ p4”以执行登录工作。“ p4登录”要求用户输入密码。 如何在Go中运行需要用户输入的程序? 以下代码不起作用。 问题答案: 从os / exec.Command文档: 在执行命令之前,设置命令的Stdin字段。

  • 我正在使用Liquibase(通过其Maven插件)来处理数据库迁移。 然而,并非所有Liquibase功能都可以通过Maven获得。特别是Generate Changelog,只能通过命令行(使用可下载的liquibase.jar)使用如下命令: 如何通过Maven可移植地执行此命令?也就是说,我不想将liquibase.jar文件添加到我的项目结构中。 相反,我想将其列为一个依赖项(我可以手动

  • 如何执行cucumber从maven与标签? 我试过的是 mvn清洁测试-Dcucumber。滤器tags=“@TestTag” 我的pom.xmltestng.xml文件,(是否有一种方法可以避免执行脚本from.xml文件,并直接使用场景或功能文件的标记名称?) 使用cucumber.io7.0.0

  • 亲爱的各位:在获取下表中所有重叠的范围后: 范围 通过使用: 我现在有一些我想避免的额外信息,例如: (a)status='unused'的行 (b)没有重叠的行 在发现范围重叠后,您知道如何避免/过滤(a)和(b)吗?

  • 问题内容: 我想知道系统上的可执行文件使用了哪些库。更具体地说,我想对使用最多的库以及使用它们的二进制文件进行排名。我怎样才能做到这一点? 问题答案: 使用到列表共享为每个可执行文件库。 清理输出 排序,计算计数,按计数排序 要在“ / bin”目录中找到所有可执行文件的答案: 将上面的“ / bin”更改为“ /”以搜索所有目录。 输出(仅针对/ bin目录)将如下所示: 编辑-删除了“ gre