Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从命令行运行nar文件?_Java_Maven_Java Native Interface_Maven Nar Plugin - Fatal编程技术网

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

Java 如何从命令行运行nar文件?,java,maven,java-native-interface,maven-nar-plugin,Java,Maven,Java Native Interface,Maven Nar Plugin,我使用Eclipse并使用narmaven插件在我的开发机器上构建了一个JNI项目。它可以在多个体系结构上编译,并留给我.nar文件 我的问题是,现在我想在nar中的一个Java类中运行主程序。当Java程序尝试加载应位于nar文件中的本机库时,我不断收到一个unsatifiedlinkerror。现在我意识到.so文件需要位于java.library.path上,但我的问题是,我看不到该在哪里指出这一点,因为唯一的副本不知何故在nar文件中。我的印象是这将在幕后处理,因为我在Java中使用了自

我使用Eclipse并使用
narmaven
插件在我的开发机器上构建了一个JNI项目。它可以在多个体系结构上编译,并留给我
.nar
文件

我的问题是,现在我想在
nar
中的一个Java类中运行主程序。当Java程序尝试加载应位于
nar
文件中的本机库时,我不断收到一个
unsatifiedlinkerror
。现在我意识到
.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>
运行
mvn install
后,我的本地
.m2/repository
目录的相应子目录中有以下文件:

  • maven metadata local.xml
  • \u 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解包
mvn-exec:java
,但这并没有让我进步。(从第一个问题中获得与该问题中描述的相同的显然为空的结果,以及我在这里为第二个问题描述的相同异常。)

审议的其他问题:

  • 似乎是关于在maven进程之外查找库。答案是以maven配置文件的形式给出的,这在我部署之后似乎没有什么帮助
  • 这涉及一个特定于运行测试的问题
  • 这一点很接近,但无论如何都没有答案。这似乎有所不同,因为海报试图以某种方式在命令行上指定库路径
  • 这一个是关于合并到一个网络应用程序,所以它是不同的。它似乎提供了这样的线索:“这两个都是作为NAR工件产生的,需要maven NAR插件才能使用。”但我还没有弄清楚插件需要如何使用

那么如何从命令行运行这个主程序呢?如果有一些预处理步骤来“提取”本机库,那是什么?如果它是自动的,那么我错过了什么?谢谢

我得到了一个提示,终于得到了

需要将此依赖项添加到POM中:

    <dependency>
        <groupId>org.scijava</groupId>
        <artifactId>native-lib-loader</artifactId>
        <version>2.2.0</version>
    </dependency>
试图从命令行直接使用
java
运行它仍然会崩溃,但在本例中,它崩溃了,因为它找不到依赖项的jar。如果我使用
-cp
标志为所有的类指定类路径条目,那么我现在可以不用maven运行它了

    <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