多模块maven项目中的Nar依赖性

 2023-01-20    357  

问题描述

我设置了一个多模块Maven项目,该项目由一个注定要构建NAR JNI库的模块和取决于该库的JAR打包模块.

我能够将NAR库安装到本地Maven存储库中,但是我无法将其用于依赖模块.

多模块maven项目中的Nar依赖性

例如,我运行mvn nar:nar-unpack,然后得到:

[INFO] ------------------------------------------------------------------------
[INFO] Building nar-dependent 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- nar-maven-plugin:3.2.0:nar-unpack (default-cli) @ nar-dependent ---
[INFO] Unpacking 0 dependencies to /home/przemek/Documents/stimulant/nar-dependent/target/nar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS

似乎没有NAR依赖性,这显然是不正确的.
此外,尝试执行使用JNI库的类的主要方法失败:

mvn exec:java -Dexec.mainClass=App

[INFO] --- exec-maven-plugin:1.4.0:java (default-cli) @ nar-dependent ---
[WARNING] 
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.UnsatisfiedLinkError: no nar-library-1.0-SNAPSHOT in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1865)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at jnibook.NarSystem.loadLibrary(NarSystem.java:23)
    at jnibook.HelloWorld.<clinit>(HelloWorld.java:10)
    at App.main(App.java:9)
    ... 6 more
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE

项目的结构看起来像这样:

.
├── nar-dependent
│   ├── pom.xml
│   └── src
│       └── main
│           └── java
│               └── App.java
├── nar-library
│   ├── pom.xml
│   └── src
│       ├── main
│       │   ├── c
│       │   │   └── HelloWorld.c
│       │   ├── include
│       │   ├── java
│       │   │   └── jnibook
│       │   │       └── HelloWorld.java
│       │   └── resources
│       └── test
│           └── java
├── parent
│   └── pom.xml

这是父pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>sidec</groupId>
    <artifactId>stimulant</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>../nar-library</module>
        <module>../nar-dependent</module>
    </modules>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

nar-library模块pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
      <groupId>sidec</groupId>
      <artifactId>stimulant</artifactId>
      <version>1.0-SNAPSHOT</version>
      <relativePath>../parent/pom.xml</relativePath>
  </parent>


  <artifactId>nar-library</artifactId>
  <packaging>nar</packaging>

  <name>nar-library</name>

    <properties>
        <skipTests>true</skipTests>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>com.github.maven-nar</groupId>
                <artifactId>nar-maven-plugin</artifactId>
                <version>3.2.0</version>
                <extensions>true</extensions>
                <configuration>
                    <cpp>
                        <exceptions>false</exceptions>
                    </cpp>
                    <libraries>
                        <library>
                            <type>jni</type>
                            <linkCPP>false</linkCPP>
                            <narSystemPackage>jnibook</narSystemPackage>
                        </library>
                    </libraries>
                    <javah>
                        <includes>
                            <include></include>
                        </includes>
                    </javah>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

NAR依赖性pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
      <groupId>sidec</groupId>
      <artifactId>stimulant</artifactId>
      <version>1.0-SNAPSHOT</version>
      <relativePath>../parent/pom.xml</relativePath>
  </parent>


  <artifactId>nar-dependent</artifactId>
  <packaging>jar</packaging>

  <name>nar-dependent</name>


    <build>
        <plugins>
            <plugin>
                <groupId>com.github.maven-nar</groupId>
                <artifactId>nar-maven-plugin</artifactId>
                <version>3.2.0</version>
                <extensions>true</extensions>
                <!--<executions>-->
                    <!--<execution>-->
                        <!--<id>nar-download</id>-->
                        <!--<goals>-->
                            <!--<goal>nar-download</goal>-->
                        <!--</goals>-->
                    <!--</execution>-->
                <!--</executions>-->
            </plugin>

        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>sidec</groupId>
            <artifactId>nar-library</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>nar</type>
        </dependency>
    </dependencies>

</project>

最后,作为证明它确实是helloworld项目,一个库类:

package jnibook;

public class HelloWorld {
    public native void print();


    static {
        NarSystem.loadLibrary();
    }
}

和客户端应用程序:

import jnibook.HelloWorld;

public class App {

    public static void main(String ... args){
        (new HelloWorld()).print();

    }
}

我引用了 https://maven-nar.github.io/examples.htmples.htmples.htmlled/a>没有成功.
我不知道怎么了.

有什么想法吗? 在这里是zip with project .

.

.

.

.

.

.

推荐答案

这可能是一个过时的问题,但我会回答所有相同的问题:

运行Java JNI应用程序时,必须告诉它在哪里可以找到持有JNI使用的相关本机C代码的.so库.
例如,如果您在可执行的jar app.jar中关闭了应用程序:

java -Djava.library.path=[path to the .so native C library] -jar app.jar

ps-由于例外,您可以看到JVM找不到本机C库:java.lang.UnsatisfiedLinkError: no nar-library-1.0-SNAPSHOT in java.library.path

其他推荐答案

我尝试使用插件的3.6.0版本的示例变​​体.使用该版本,我至少得到

Unpacking 1 dependencies to /home/karsten/svn/hellotest/target/nar

,当我在依赖模块中运行mvn nar:nar-unpack时,.so被打开包装.
但是,我发现在依赖模块中使mvn nar:nar-integration-test工作的唯一方法是编写

LD_LIBRARY_PATH=target/nar/hellojni-0.0-amd64-Linux-gpp-jni/lib/amd64-Linux-gpp/jni mvn nar:nar-integration-test

我尝试了几种指定java.library.path的方法,但没有成功.

以上所述是小编给大家介绍的多模块maven项目中的Nar依赖性,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26021.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。