使用maven-jlink-plugin时是否可以添加maven依赖项?

问题描述 投票:6回答:4

我正在使用此Github project来接触Java 9中的新模块化功能。我想向项目添加依赖项并能够构建本机映像。但是,当我尝试向pom.xml添加新的依赖项,并将require语句添加至module-info.java时,我从maven-jlink-plugin收到以下错误:

Error: module-info.class not found for joda.time module

[我试图以此为概念证明,可以使用新的链接阶段来部署映像,但是自然地,我需要能够具有外部依赖关系,并且需要使用maven(工作约束)。

对mod-jar / pom.xml的更改

...
 <dependencies>
    <dependency>
      <groupId>joda-time</groupId>
      <artifactId>joda-time</artifactId>
      <version>2.9.9</version>
    </dependency>
  </dependencies>
...

mod-jar / module-info.java

module com.soebes.nine.jar {
  requires java.base;
  requires joda.time;
  exports com.soebes.example.nine.jar;
}

日志:

[INFO] --- maven-jlink-plugin:3.0.0-alpha-1:jlink (default-jlink) @ mod-jlink ---
[INFO] Toolchain in maven-jlink-plugin: jlink [ /Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/bin/jlink ]
[INFO] The following dependencies will be linked into the runtime image:
[INFO]  -> module: com.soebes.nine.one ( /Users/sebastianrestrepo/Projects/jdk9-jlink-jmod-example/maven-example/mod-1/target/jmods/com.soebes.nine.one.jmod )
[INFO]  -> module: com.soebes.nine.two ( /Users/sebastianrestrepo/Projects/jdk9-jlink-jmod-example/maven-example/mod-2/target/jmods/com.soebes.nine.two.jmod )
[INFO]  -> module: com.soebes.nine.jar ( /Users/sebastianrestrepo/Projects/jdk9-jlink-jmod-example/maven-example/mod-jar/target/com.soebes.nine.jar-1.0-SNAPSHOT.jar )
[INFO]  -> module: joda.time ( /Users/sebastianrestrepo/.m2/repository/joda-time/joda-time/2.9.9/joda-time-2.9.9.jar )
[ERROR] 
Error: module-info.class not found for joda.time module
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] parent ............................................. SUCCESS [  1.460 s]
[INFO] com.soebes.nine.one ................................ SUCCESS [  2.022 s]
[INFO] com.soebes.nine.two ................................ SUCCESS [  1.392 s]
[INFO] com.soebes.nine.jar ................................ SUCCESS [  1.388 s]
[INFO] mod-jlink .......................................... FAILURE [  1.061 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.911 s
[INFO] Finished at: 2017-11-03T15:27:35-04:00
[INFO] Final Memory: 26M/981M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-jlink-plugin:3.0.0-alpha-1:jlink (default-jlink) on project mod-jlink: 

非常感谢您的帮助。谢谢。

java maven jodatime java-9 jlink
4个回答
9
投票

具有not much to do with the plugin I believe。在您的情况下,模块joda.time似乎是自动模块

jlink tool does not support linking of automatic modules,因为它们可以依赖类路径的任意内容,这与独立Java运行时的想法背道而驰。

因此,有两种方法可以解决此问题:-

  • ((您不是jar的所有者),暂时继续创建jlink [您可以为其创建module-info.java]并使用相应的已编译类更新jar [使用use jdeps tool工具],如项目Java 9。

  • ((您拥有依赖关系)将jar永久迁移到Java 9本身,在编译和打包后,它将由jdeps本身组成。


2
投票

您可以使用jar将模块描述符添加到JAR并使用该模块创建模块化运行时映像。

免责声明:我是ModiTect的作者。


0
投票

让我尝试解释一下这方面的技术背景:

joda-time在问题中给出的2.9.9版本中是一个非模块化jar,它不包含module-info.class,并且不通过使用Automatic-Module-Name声明其自身为自动模块:在其META-INF / MANIFEST.MF中

[实际模块中的类无法在类路径上调用类,因此您不能在该模块信息中使用该版本的” requires jode.time”。

自动模块可以使用ClassPath上的类。为了在实际模块中使用非模块化jar中的类,可以使用包装器,该包装器本身是自动模块。

到现在为止,存在joda-time的2.10.1版本,它是一个自动模块,并声明“ Automatic-Module-Name:org.joda.time”,因此您可以使用“ requires org.joda.time”在具有该新版本的真实模块中。

现在,新的jlink工具无法直接与非模块化jar或自动jar一起使用,并且maven-jlink插件目前基本上只是jlink工具的maven包装器,将其配置参数转换为jlink工具的参数。

为了使用混合的maven依赖项与真实模块,自动模块和非模块化jar创建项目的自定义Java运行时,您必须了解真实模块,自动模块和非模块化jar的所有系统模块依赖关系,以及而不是使用--add-modules参数与这些链接。

要收集系统模块依赖性,可以使用新的jdeps工具,该工具具有--print-module-deps或--list-deps参数,具体取决于所使用的实际JDK版本。

如果您在项目中使用maven,则可以通过创建或使用为您执行此操作的maven插件来自动化该任务。


-1
投票

所以现在是2020年6月7日,如果我对外部项目有依赖项,例如org.apache.logging.log4j / log4j-api / 2.13,那么我的maven项目是否仍无法生成链接Java运行时仍是这种情况.3因为这些依赖关系不会构建为模块,除非我在罐子上执行此数字心脏手术以插入module-info.class

或者我错过了什么?

© www.soinside.com 2019 - 2024. All rights reserved.