首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Maven nar插件: nar文件不在依赖项目的类路径中

Maven nar插件: nar文件不在依赖项目的类路径中
EN

Stack Overflow用户
提问于 2019-09-27 21:36:22
回答 1查看 395关注 0票数 1

我在一个maven项目中有一个用C编写的JNI共享库和相应的Java类,在另一个项目中有一个使用该类的应用程序。我使用nar-maven-plugin来处理JNI。版本: Maven 3.6.0 Java 12 nar plugin 3.6.0我使用nar-maven-plugin附带的集成测试3和4作为示例。对于它3,我刚刚将POM更新为独立的,并与Java 12一起使用:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!--
  #%L
  Native ARchive plugin for Maven
  %%
  Copyright (C) 2002 - 2014 NAR Maven Plugin developers.
  %%
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
  #L%
  -->

<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>

  <groupId>com.github.maven-nar</groupId>
  <artifactId>it0003-jni</artifactId>
  <packaging>nar</packaging>

  <name>NAR JNI Test</name>
  <version>1.0-SNAPSHOT</version>
  <description>
    Simple JNI Library
  </description>
  <url>http://maven.apache.org/</url>

  <properties>
    <skipTests>true</skipTests>
    <maven-compiler.version>3.8.1</maven-compiler.version>
    <surefire.version>2.22.2</surefire.version>
    <java.version>12</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  </properties>  
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <defaultGoal>install</defaultGoal>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>${maven-compiler.version}</version>
        <configuration>
          <source>${java.version}</source>
          <target>${java.version}</target>
          <compilerArgs>
            <arg>-Xlint</arg>
            <arg>-h</arg>
            <arg>${project.build.directory}/nar/javah-include</arg>
          </compilerArgs>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>${surefire.version}</version>
        <configuration>
          <excludes>
            <exclude>**/*Test.java</exclude>
          </excludes>
          <argLine>
            <!-- - -illegal-access=permit-->
          </argLine>
        </configuration>
      </plugin>
      <plugin>
        <groupId>com.github.maven-nar</groupId>
        <artifactId>nar-maven-plugin</artifactId>
        <version>3.6.0</version>
        <extensions>true</extensions>
        <configuration>
          <cpp>
            <debug>true</debug>
          </cpp>
          <c>
            <testOptions>
              <testOption>-DTESTOPT="this is a nar-testCompile flag"</testOption>
            </testOptions>
          </c>
          <libraries>
            <library>
              <type>jni</type>
              <narSystemPackage>it0003</narSystemPackage>
              <linkCPP>false</linkCPP>
            </library>
          </libraries>
          <javah>
            <includes>
              <include></include>
            </includes>
          </javah>
          <tests>
            <test>
              <name>HelloWorld</name>
            </test>
          </tests>
        </configuration>
        <executions> 
          <execution>
            <id>default-nar-javah</id>
            <phase>none</phase>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

我在这个项目上运行mvn install,它安装在我的.m2目录中

代码语言:javascript
复制
/home/karsten/.m2/repository/com/github/maven-nar/it0003-jni/:
total 0
drwxr-xr-x 1 karsten karsten 4096 Sep 27 12:20 1.0-SNAPSHOT
-rw-r--r-- 1 karsten karsten  288 Sep 27 12:21 maven-metadata-local.xml

/home/karsten/.m2/repository/com/github/maven-nar/it0003-jni/1.0-SNAPSHOT:
total 20
-rw-r--r-- 1 karsten karsten  250 Sep 27 12:21 _remote.repositories
-rw-r--r-- 1 karsten karsten 3097 Sep 27 12:21 it0003-jni-1.0-SNAPSHOT-amd64-Linux-gpp-jni.nar
-rw-r--r-- 1 karsten karsten 4570 Sep 27 12:21 it0003-jni-1.0-SNAPSHOT.nar
-rw-r--r-- 1 karsten karsten 4086 Sep 27 12:21 it0003-jni-1.0-SNAPSHOT.pom
-rw-r--r-- 1 karsten karsten  925 Sep 27 12:21 maven-metadata-local.xml

it0003-jni-1.0-SNAPSHOT.nar包含

代码语言:javascript
复制
META-INF/MANIFEST.MF
META-INF/
META-INF/nar/
META-INF/nar/com.github.maven-nar/
META-INF/nar/com.github.maven-nar/it0003-jni/
it0003/
META-INF/maven/
META-INF/maven/com.github.maven-nar/
META-INF/maven/com.github.maven-nar/it0003-jni/
META-INF/nar/com.github.maven-nar/it0003-jni/nar.properties
it0003/HelloWorldJNI.class
it0003/NarSystem.class
META-INF/maven/com.github.maven-nar/it0003-jni/pom.xml
META-INF/maven/com.github.maven-nar/it0003-jni/pom.properties

现在我使用它的一个精简版本4来测试它,这是Java文件src/main/java/it0004/Hello.java

代码语言:javascript
复制
package it0004;

import it0003.HelloWorldJNI;

public class Hello {
    public static void hello()
    {
        HelloWorldJNI.sayHello();
    }
}

而POM是

代码语言:javascript
复制
<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>
  <properties>
    <java.version>12</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven-compiler.version>3.8.1</maven-compiler.version>
    <maven-source.version>2.0.4</maven-source.version>
    <nar-plugin.version>3.6.0</nar-plugin.version>
  </properties>
  <groupId>mygroup</groupId>
  <artifactId>myit0004</artifactId>
  <packaging>jar</packaging>
  <version>1.0.0</version>
  <name>Java dependency test</name>
  <dependencies>
    <dependency>
      <groupId>com.github.maven-nar</groupId>
      <artifactId>it0003-jni</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>nar</type>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>${maven-compiler.version}</version>
        <configuration>
          <source>${java.version}</source>
          <target>${java.version}</target>
          <compilerArgs>
            <arg>-Xlint</arg>
          </compilerArgs>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

请注意,此POM仅处理编译。依赖关系用<type>nar</type>指定,这样就可以找到依赖关系。但是nar文件不在classPath中,因此编译失败。mvn -X compile的输出包含

代码语言:javascript
复制
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ myit0004 ---
[DEBUG] Dependency collection stats: {ConflictMarker.analyzeTime=428200, ConflictMarker.markTime=241300, ConflictMarker.nodeCount=118, ConflictIdSorter.graphTime=137600, ConflictIdSorter.topsortTime=62600, ConflictIdSorter.conflictIdCount=45, ConflictIdSorter.conflictIdCycleCount=0, ConflictResolver.totalTime=4391200, ConflictResolver.conflictItemCount=72, DefaultDependencyCollector.collectTime=419330500, DefaultDependencyCollector.transformTime=5343800}
[DEBUG] org.apache.maven.plugins:maven-compiler-plugin:jar:3.8.1:
[DEBUG]    org.apache.maven:maven-plugin-api:jar:3.0:compile
[DEBUG]       org.apache.maven:maven-model:jar:3.0:compile
[DEBUG]       org.sonatype.sisu:sisu-inject-plexus:jar:1.4.2:compile
[DEBUG]          org.sonatype.sisu:sisu-inject-bean:jar:1.4.2:compile
[DEBUG]             org.sonatype.sisu:sisu-guice:jar:noaop:2.1.7:compile
[DEBUG]    org.apache.maven:maven-artifact:jar:3.0:compile
[DEBUG]       org.codehaus.plexus:plexus-utils:jar:2.0.4:compile
[DEBUG]    org.apache.maven:maven-core:jar:3.0:compile
[DEBUG]       org.apache.maven:maven-settings:jar:3.0:compile
[DEBUG]       org.apache.maven:maven-settings-builder:jar:3.0:compile
[DEBUG]       org.apache.maven:maven-repository-metadata:jar:3.0:compile
[DEBUG]       org.apache.maven:maven-model-builder:jar:3.0:compile
[DEBUG]       org.apache.maven:maven-aether-provider:jar:3.0:runtime
[DEBUG]       org.sonatype.aether:aether-impl:jar:1.7:compile
[DEBUG]          org.sonatype.aether:aether-spi:jar:1.7:compile
[DEBUG]       org.sonatype.aether:aether-api:jar:1.7:compile
[DEBUG]       org.sonatype.aether:aether-util:jar:1.7:compile
[DEBUG]       org.codehaus.plexus:plexus-interpolation:jar:1.14:compile
[DEBUG]       org.codehaus.plexus:plexus-classworlds:jar:2.2.3:compile
[DEBUG]       org.codehaus.plexus:plexus-component-annotations:jar:1.7.1:compile
[DEBUG]       org.sonatype.plexus:plexus-sec-dispatcher:jar:1.3:compile
[DEBUG]          org.sonatype.plexus:plexus-cipher:jar:1.4:compile
[DEBUG]    org.apache.maven.shared:maven-shared-utils:jar:3.2.1:compile
[DEBUG]       commons-io:commons-io:jar:2.5:compile
[DEBUG]    org.apache.maven.shared:maven-shared-incremental:jar:1.1:compile
[DEBUG]    org.codehaus.plexus:plexus-java:jar:0.9.10:compile
[DEBUG]       org.ow2.asm:asm:jar:6.2:compile
[DEBUG]       com.thoughtworks.qdox:qdox:jar:2.0-M9:compile
[DEBUG]    org.codehaus.plexus:plexus-compiler-api:jar:2.8.4:compile
[DEBUG]    org.codehaus.plexus:plexus-compiler-manager:jar:2.8.4:compile
[DEBUG]    org.codehaus.plexus:plexus-compiler-javac:jar:2.8.4:runtime
[DEBUG] Created new class realm plugin>org.apache.maven.plugins:maven-compiler-plugin:3.8.1
[DEBUG] Importing foreign packages into class realm plugin>org.apache.maven.plugins:maven-compiler-plugin:3.8.1
[DEBUG]   Imported:  < maven.api
[DEBUG] Populating class realm plugin>org.apache.maven.plugins:maven-compiler-plugin:3.8.1
[DEBUG]   Included: org.apache.maven.plugins:maven-compiler-plugin:jar:3.8.1
[DEBUG]   Included: org.sonatype.sisu:sisu-inject-bean:jar:1.4.2
[DEBUG]   Included: org.sonatype.sisu:sisu-guice:jar:noaop:2.1.7
[DEBUG]   Included: org.codehaus.plexus:plexus-utils:jar:2.0.4
[DEBUG]   Included: org.sonatype.aether:aether-util:jar:1.7
[DEBUG]   Included: org.codehaus.plexus:plexus-interpolation:jar:1.14
[DEBUG]   Included: org.codehaus.plexus:plexus-component-annotations:jar:1.7.1
[DEBUG]   Included: org.sonatype.plexus:plexus-sec-dispatcher:jar:1.3
[DEBUG]   Included: org.sonatype.plexus:plexus-cipher:jar:1.4
[DEBUG]   Included: org.apache.maven.shared:maven-shared-utils:jar:3.2.1
[DEBUG]   Included: commons-io:commons-io:jar:2.5
[DEBUG]   Included: org.apache.maven.shared:maven-shared-incremental:jar:1.1
[DEBUG]   Included: org.codehaus.plexus:plexus-java:jar:0.9.10
[DEBUG]   Included: org.ow2.asm:asm:jar:6.2
[DEBUG]   Included: com.thoughtworks.qdox:qdox:jar:2.0-M9
[DEBUG]   Included: org.codehaus.plexus:plexus-compiler-api:jar:2.8.4
[DEBUG]   Included: org.codehaus.plexus:plexus-compiler-manager:jar:2.8.4
[DEBUG]   Included: org.codehaus.plexus:plexus-compiler-javac:jar:2.8.4
[DEBUG] Configuring mojo org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile from plugin realm ClassRealm[plugin>org.apache.maven.plugins:maven-compiler-plugin:3.8.1, parent: jdk.internal.loader.ClassLoaders$AppClassLoader@446cdf90]
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile' with basic configurator -->
[DEBUG]   (f) basedir = /home/karsten/svn/myit0004
[DEBUG]   (f) buildDirectory = /home/karsten/svn/myit0004/target
[DEBUG]   (f) compilePath = [/home/karsten/svn/myit0004/target/classes]
[DEBUG]   (f) compileSourceRoots = [/home/karsten/svn/myit0004/src/main/java]
[DEBUG]   (f) compilerArgs = [-Xlint]
[DEBUG]   (f) compilerId = javac
[DEBUG]   (f) debug = true
[DEBUG]   (f) encoding = UTF-8
[DEBUG]   (f) failOnError = true
[DEBUG]   (f) failOnWarning = false
[DEBUG]   (f) forceJavacCompilerUse = false
[DEBUG]   (f) fork = false
[DEBUG]   (f) generatedSourcesDirectory = /home/karsten/svn/myit0004/target/generated-sources/annotations
[DEBUG]   (f) mojoExecution = org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile {execution: default-compile}
[DEBUG]   (f) optimize = false
[DEBUG]   (f) outputDirectory = /home/karsten/svn/myit0004/target/classes
[DEBUG]   (f) parameters = false
[DEBUG]   (f) project = MavenProject: mygroup:myit0004:1.0.0 @ /home/karsten/svn/myit0004/pom.xml
[DEBUG]   (f) projectArtifact = mygroup:myit0004:jar:1.0.0
[DEBUG]   (f) session = org.apache.maven.execution.MavenSession@3e84111a
[DEBUG]   (f) showDeprecation = false
[DEBUG]   (f) showWarnings = false
[DEBUG]   (f) skipMultiThreadWarning = false
[DEBUG]   (f) source = 12
[DEBUG]   (f) staleMillis = 0
[DEBUG]   (s) target = 12
[DEBUG]   (f) useIncrementalCompilation = true
[DEBUG]   (f) verbose = false
[DEBUG] -- end configuration --
[DEBUG] Using compiler 'javac'.
[DEBUG] Adding /home/karsten/svn/myit0004/target/generated-sources/annotations to compile source roots:
  /home/karsten/svn/myit0004/src/main/java
[DEBUG] New compile source roots:
  /home/karsten/svn/myit0004/src/main/java
  /home/karsten/svn/myit0004/target/generated-sources/annotations
[DEBUG] CompilerReuseStrategy: reuseCreated
[DEBUG] useIncrementalCompilation enabled
[DEBUG] Stale source detected: /home/karsten/svn/myit0004/src/main/java/it0004/Hello.java
[INFO] Changes detected - recompiling the module!
[DEBUG] Classpath:
[DEBUG]  /home/karsten/svn/myit0004/target/classes
[DEBUG] Source roots:
[DEBUG]  /home/karsten/svn/myit0004/src/main/java
[DEBUG]  /home/karsten/svn/myit0004/target/generated-sources/annotations
[DEBUG] Command line options:
[DEBUG] -d /home/karsten/svn/myit0004/target/classes -classpath /home/karsten/svn/myit0004/target/classes: -sourcepath /home/karsten/svn/myit0004/src/main/java:/home/karsten/svn/myit0004/target/generated-sources/annotations: -s /home/karsten/svn/myit0004/target/generated-sources/annotations -g -nowarn -target 12 -source 12 -encoding UTF-8 -Xlint
[DEBUG] incrementalBuildHelper#beforeRebuildExecution
[INFO] Compiling 1 source file to /home/karsten/svn/myit0004/target/classes
[DEBUG] incrementalBuildHelper#afterRebuildExecution
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /home/karsten/svn/myit0004/src/main/java/it0004/Hello.java:[3,14] package it0003 does not exist
[ERROR] /home/karsten/svn/myit0004/src/main/java/it0004/Hello.java:[8,9] cannot find symbol
  symbol:   variable HelloWorldJNI
  location: class it0004.Hello
[INFO] 2 errors
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.606 s
[INFO] Finished at: 2019-09-27T13:28:44Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project myit0004: Compilation failure: Compilation failure:
[ERROR] /home/karsten/svn/myit0004/src/main/java/it0004/Hello.java:[3,14] package it0003 does not exist
[ERROR] /home/karsten/svn/myit0004/src/main/java/it0004/Hello.java:[8,9] cannot find symbol
[ERROR]   symbol:   variable HelloWorldJNI
[ERROR]   location: class it0004.Hello

可以看到,依赖项的nar文件不在classPath中,因此编译失败,因为它找不到依赖项类。如何确保nar文件包含在classPath中?

EN

Stack Overflow用户

发布于 2019-10-01 17:46:43

找到答案了。我应该看一下it0025示例。需要添加到依赖项目的pom.xml中的内容是

代码语言:javascript
复制
      <plugin>
        <groupId>com.github.maven-nar</groupId>
        <artifactId>nar-maven-plugin</artifactId>
        <version>${nar-plugin.version}</version>
        <extensions>true</extensions>
        <executions>
          <execution>
            <id>nar-download</id>
            <goals>
              <goal>nar-download</goal>
            </goals>
          </execution>
          <execution>
            <id>nar-test-unpack</id>
            <goals>
              <goal>nar-test-unpack</goal>
            </goals>
          </execution>
          <execution>
            <id>nar-integration-test</id>
            <goals>
              <goal>nar-integration-test</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58135663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档