我使用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-unpackmvn 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的情况下运行它。

09-11 03:56