如何从命令行 运行 nar 文件?
How to run nar file from command line?
我使用 Eclipse 并使用 nar-maven
插件在我的开发机器上构建了一个 JNI 项目。在多个体系结构上编译并给我留下 .nar
个文件。
我的问题是现在我想运行主程序在Java类之一中nar
。当 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
这个问题 看起来很接近,但答案取决于已经以某种方式拥有本机库 "exposed"。我跟着提问者尝试 mvn nar:nar-unpack
和 mvn exec:java
,但这并没有让我进步。 (从第一个问题中获得相同的显然为空的结果,以及我在此处为第二个问题描述的相同异常。)
考虑的其他问题:
- Maven - UnsatisfiedLinkError with java.library.path 好像是在maven进程之外找库。根据 maven 配置文件给出的答案,一旦我部署后似乎没有帮助。
- maven-nar-plugin and tests in dependent module 这处理特定于 运行ning 测试的问题。
- nar-maven-plugin and native-library-loader dont load native lib 这个很接近,但无论如何都没有答案。它似乎有所不同,因为该发布者试图以某种方式在命令行上指定库路径。
- Using a native Maven artifact (nar) in a webapp这个是集成到webapp里面的,所以不一样。它似乎提供了这样的线索:"Both of these are produced as NAR artifacts and require the maven-nar plugin in order to be used."但是我还没有弄清楚这个插件需要如何使用!
那么我如何从命令行 运行 这个主程序?如果 "extract" 本机库有一些预处理步骤,那是什么?如果它是自动的,那我错过了什么?谢谢!
打赏了,终于拿到了!
需要将此依赖项添加到 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
运行 它仍然崩溃,但在这种情况下它崩溃是因为它没有找到依赖项的 jars。如果我用 -cp
标志为所有路径条目指定 class 路径条目,我想我现在可以 运行 它没有 maven。
我使用 Eclipse 并使用 nar-maven
插件在我的开发机器上构建了一个 JNI 项目。在多个体系结构上编译并给我留下 .nar
个文件。
我的问题是现在我想运行主程序在Java类之一中nar
。当 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
这个问题 mvn nar:nar-unpack
和 mvn exec:java
,但这并没有让我进步。 (从第一个问题中获得相同的显然为空的结果,以及我在此处为第二个问题描述的相同异常。)
考虑的其他问题:
- Maven - UnsatisfiedLinkError with java.library.path 好像是在maven进程之外找库。根据 maven 配置文件给出的答案,一旦我部署后似乎没有帮助。
- maven-nar-plugin and tests in dependent module 这处理特定于 运行ning 测试的问题。
- nar-maven-plugin and native-library-loader dont load native lib 这个很接近,但无论如何都没有答案。它似乎有所不同,因为该发布者试图以某种方式在命令行上指定库路径。
- Using a native Maven artifact (nar) in a webapp这个是集成到webapp里面的,所以不一样。它似乎提供了这样的线索:"Both of these are produced as NAR artifacts and require the maven-nar plugin in order to be used."但是我还没有弄清楚这个插件需要如何使用!
那么我如何从命令行 运行 这个主程序?如果 "extract" 本机库有一些预处理步骤,那是什么?如果它是自动的,那我错过了什么?谢谢!
打赏了,终于拿到了!
需要将此依赖项添加到 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
运行 它仍然崩溃,但在这种情况下它崩溃是因为它没有找到依赖项的 jars。如果我用 -cp
标志为所有路径条目指定 class 路径条目,我想我现在可以 运行 它没有 maven。