我使用Eclipse并使用nar-maven
插件在我的开发机器上构建了一个JNI项目。这会编译多个体系结构,并留下.nar
个文件。
我的问题是现在我想在nar
的一个Java类中运行主程序。当Java程序尝试加载应该在UnsatisfiedLinkError
文件中的本机库时,我不断获得nar
。现在我意识到.so
文件需要在java.library.path
上,但我的问题是我无法看到在哪里提出这一点,因为唯一的副本在某种程度上位于nar
文件中。我的印象是,这将在幕后处理,因为我在Java中使用自动生成的NarSystem.loadLibrary
方法。
详细信息如下。
配置nar
插件的POM部分:
<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看起来很接近,但答案取决于已经拥有本地图书馆&#34;暴露&#34;不知何故。我跟着提问者试着mvn nar:nar-unpack
和mvn exec:java
,但这并没有推进我。 (从该问题中描述的第一个获得相同的明显无效结果,以及我在此为第二个描述的相同异常。)
考虑的其他问题:
那么如何从命令行运行这个主程序呢?如果有一些预处理步骤来提取&#34;提取&#34;本土图书馆是什么?如果它是自动的,那么我错过了什么?谢谢!
答案 0 :(得分:1)
我得到了小费,终于明白了!
需要将此依赖项添加到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的情况下运行它。