Java 如何从命令行运行nar文件?
我使用Eclipse并使用Java 如何从命令行运行nar文件?,java,maven,java-native-interface,maven-nar-plugin,Java,Maven,Java Native Interface,Maven Nar Plugin,我使用Eclipse并使用narmaven插件在我的开发机器上构建了一个JNI项目。它可以在多个体系结构上编译,并留给我.nar文件 我的问题是,现在我想在nar中的一个Java类中运行主程序。当Java程序尝试加载应位于nar文件中的本机库时,我不断收到一个unsatifiedlinkerror。现在我意识到.so文件需要位于java.library.path上,但我的问题是,我看不到该在哪里指出这一点,因为唯一的副本不知何故在nar文件中。我的印象是这将在幕后处理,因为我在Java中使用了自
narmaven
插件在我的开发机器上构建了一个JNI项目。它可以在多个体系结构上编译,并留给我.nar
文件
我的问题是,现在我想在nar
中的一个Java类中运行主程序。当Java程序尝试加载应位于nar
文件中的本机库时,我不断收到一个unsatifiedlinkerror
。现在我意识到.so
文件需要位于java.library.path
上,但我的问题是,我看不到该在哪里指出这一点,因为唯一的副本不知何故在nar
文件中。我的印象是这将在幕后处理,因为我在Java中使用了自动生成的NarSystem.loadLibrary
方法
详情如下
我的POM中配置nar
插件的部分:
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<version>3.5.1</version>
<extensions>true</extensions>
<configuration>
<libraries>
<library>
<type>jni</type>
<narSystemPackage>com.myco.package</narSystemPackage>
</library>
</libraries>
</configuration>
</plugin>
运行mvn install
后,我的本地.m2/repository
目录的相应子目录中有以下文件:
maven metadata local.xml
\u maven.repositories
project-0.0.1-arm-Linux-gpp-jni.nar
project-0.0.1.nar
project-0.0.1.pom
project-0.0.1-javadoc.jar
java -cp /home/myname/.m2/repository/com/myco/project/0.0.1/project-0.0.1.nar com.myco.package.MainClass
它开始运行相应的主程序,因此找到了Java部分。当它到达应该加载本机库(上面的静态块)的位置时,它抛出错误
Exception in thread "main" java.lang.UnsatisfiedLinkError: no project-0.0.1 in java.library.path
这个问题看起来很接近,但答案取决于本机库已经以某种方式“公开”了。我跟随提问者尝试mvn-nar:nar解包
和mvn-exec:java
,但这并没有让我进步。(从第一个问题中获得与该问题中描述的相同的显然为空的结果,以及我在这里为第二个问题描述的相同异常。)
审议的其他问题:
- 似乎是关于在maven进程之外查找库。答案是以maven配置文件的形式给出的,这在我部署之后似乎没有什么帮助
- 这涉及一个特定于运行测试的问题
- 这一点很接近,但无论如何都没有答案。这似乎有所不同,因为海报试图以某种方式在命令行上指定库路径
- 这一个是关于合并到一个网络应用程序,所以它是不同的。它似乎提供了这样的线索:“这两个都是作为NAR工件产生的,需要maven NAR插件才能使用。”但我还没有弄清楚插件需要如何使用李>
那么如何从命令行运行这个主程序呢?如果有一些预处理步骤来“提取”本机库,那是什么?如果它是自动的,那么我错过了什么?谢谢 我得到了一个提示,终于得到了 需要将此依赖项添加到POM中:
<dependency>
<groupId>org.scijava</groupId>
<artifactId>native-lib-loader</artifactId>
<version>2.2.0</version>
</dependency>
试图从命令行直接使用java
运行它仍然会崩溃,但在本例中,它崩溃了,因为它找不到依赖项的jar。如果我使用-cp
标志为所有的类指定类路径条目,那么我现在可以不用maven运行它了
<dependency>
<groupId>org.scijava</groupId>
<artifactId>native-lib-loader</artifactId>
<version>2.2.0</version>
</dependency>
mvn exec:java -Dexec.mainClass=com.myco.package.MainClass