2017-07-27 145 views
1

我使用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-unpackmvn exec:java,但那并没有提升我。 (获取从在这个问题描述的第一次,我描述这里的第二个相同的异常同一显然空的结果。)

其他问题考虑:

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

回答

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在命令行仍坠毁运行它运行它,但在这种情况下,它崩溃了,因为它没有找到依赖关系的罐子。据推测,如果我要用-cp标志为所有人指定类路径条目,我现在可以不用maven来运行它。