我使用Eclipse并使用nar-maven
插件在我的开发机器上构建了一个JNI项目。它编译在多个体系结构上,并给我留下了.nar
文件。如何从命令行运行nar文件?
我的问题是,现在我想在nar
的Java类之一中运行主程序。当Java程序尝试加载应该位于nar
文件中的本机库时,我一直收到UnsatisfiedLinkError
。现在我意识到.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这是一个关于整合到一个web应用程序,所以它是不同的。它似乎提供了这样的线索:“这两个都是作为NAR构件生成的,并且需要使用maven-nar插件才能使用。”但我还没有想出如何使用插件!
那么如何从命令行运行这个主程序呢?如果有一些预处理步骤来“提取”本地库,它是什么?如果它是自动的,那么我错过了什么?谢谢!