我使用Eclipse,并使用nar-maven
插件在开发计算机上构建了JNI项目。可以在多种体系结构上进行编译,而剩下.nar
文件。
我的问题是,现在我想在nar
的Java类之一中运行主程序。当Java程序尝试加载应该在UnsatisfiedLinkError
文件中的本机库时,我总是得到nar
。现在我意识到.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>
在我的一个Java类中,我有一个静态初始化程序,该初始化程序调用用于加载库的自动生成的方法:
static {
com.myco.package.NarSystem.loadLibrary();
}
运行
mvn install
之后,我的本地.m2/repository
目录的相应子目录中包含以下文件:maven-metadata-local.xml
_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
这个问题Nar dependency in multi-module maven project看起来很接近,但是答案取决于已经以某种方式“公开”了本机库。我在那追问提问者,尝试
mvn nar:nar-unpack
和mvn exec:java
,但这并没有使我前进。 (从第一个问题中获得与第一个问题相同的明显为空的结果,以及与我在第二个问题中所述的相同的异常。)考虑的其他问题:
Maven - UnsatisfiedLinkError with java.library.path似乎与在Maven流程之外查找库有关。根据maven配置文件给出的答案,一旦部署就似乎无济于事。
maven-nar-plugin and tests in dependent module处理特定于运行测试的问题。
nar-maven-plugin and native-library-loader dont load native lib这个很接近,但是无论如何都没有答案。这似乎有所不同,因为该发布者试图以某种方式在命令行上指定库路径。
Using a native Maven artifact (nar) in a webapp这是关于将其合并到webapp中的操作,因此有所不同。它似乎确实提供了线索:“这两个都是NAR工件,需要使用maven-nar插件才能使用。”但是我还没有弄清楚该插件如何使用!
那么,如何从命令行运行该主程序?如果有一些预处理步骤可以“提取”本机库,那是什么?如果是自动的,那我想念什么?谢谢!
最佳答案
我得到了小费,终于知道了!
需要将此依赖项添加到POM:
<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
尝试从命令行直接使用
java
直接运行它仍然失败,但是在这种情况下,它崩溃了,因为它没有找到依赖项的jar。如果我要使用-cp
标志为所有它们指定类路径条目,那么大概现在就可以在没有maven的情况下运行它。