简体   繁体   中英

Nar dependency in multi-module maven project

I set up a multi module maven project, which is comprised of a module destined to build nar jni library, and a jar packaged module that is dependent on that library.

I am able to install the nar library to my local maven repository, but I fail to use it in dependent module.

For instance, I run mvn nar:nar-unpack and I get:

[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

It seems that there are no nar dependencies, which is obviously not true. Moreover, trying to execute the main method of the class that makes use of the jni library fails:

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

The structure of the project looks like this:

.
├── 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

Here is the parent 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>

The nar-library module 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>

The nar-dependent 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>

Finally, as a proof that it is really the HelloWorld project, a library class:

package jnibook;

public class HelloWorld {
    public native void print();


    static {
        NarSystem.loadLibrary();
    }
} 

and a client app:

import jnibook.HelloWorld;

public class App {

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

    }
}

I referenced https://maven-nar.github.io/examples.html with no success. I have no idea what is going wrong.

Any ideas? Here is zip with project .

This might be an outdated question, but I'll answer all the same :

When running the java JNI app, it must be told where to find the .so library holding the relevant native C code used by JNI. For example, if you closed your app in the executable jar app.jar :

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

PS - you can see that the JVM can't find the native C library thanks to the exception : java.lang.UnsatisfiedLinkError: no nar-library-1.0-SNAPSHOT in java.library.path

I have tried my own variant of your example with version 3.6.0 of the plugin. With that version, I at least get

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

and the .so gets unpacked when I run mvn nar:nar-unpack in the dependent module. But the only way I have found to make mvn nar:nar-integration-test work in the dependent module, is by writing

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

I tried several ways of specifying java.library.path , but with no success.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM