如何从命令行运行nar文件?

时间:2017-07-27 20:16:55

标签: java maven java-native-interface maven-nar-plugin

我使用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-unpackmvn exec:java,但这并没有推进我。 (从该问题中描述的第一个获得相同的明显无效结果,以及我在此为第二个描述的相同异常。)

考虑的其他问题:

那么如何从命令行运行这个主程序呢?如果有一些预处理步骤来提取&#34;提取&#34;本土图书馆是什么?如果它是自动的,那么我错过了什么?谢谢!

1 个答案:

答案 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的情况下运行它。