有没有办法在使用maven-jlink-plugin时添加maven依赖项?

sre*_*epo 5 java jodatime jlink maven java-9

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

Error: module-info.class not found for joda.time module
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用它作为概念证明,我可以使用新的链接阶段部署图像,但自然我需要能够具有外部依赖性,我需要使用maven(工作约束).

对mod-jar/pom.xml的更改

...
 <dependencies>
    <dependency>
      <groupId>joda-time</groupId>
      <artifactId>joda-time</artifactId>
      <version>2.9.9</version>
    </dependency>
  </dependencies>
...
Run Code Online (Sandbox Code Playgroud)

MOD-罐/ module-info.java

module com.soebes.nine.jar {
  requires java.base;
  requires joda.time;
  exports com.soebes.example.nine.jar;
}
Run Code Online (Sandbox Code Playgroud)

日志:

[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: 
Run Code Online (Sandbox Code Playgroud)

我真的很感激任何帮助.谢谢.

Nam*_*man 9

与我认为的插件没什么关系.joda.time您的案例中的模块似乎是一个自动模块.

jlink工具不支持自动模块的链接,因为它们可以依赖于类路径的任意内容,这违背了自包含Java运行时的想法.

所以有两种方法可以解决这个问题: -

  • (你没有自己的jar)暂时继续创造module-info.java[你可以使用jdeps的工具吧]和更新JAR [使用jar工具]与相应的编译类作为Java中9下的项目.

  • (您拥有依赖项)永久地将jar迁移到Java 9本身,它module-info.class在编译和打包后由它自己组成.

  • 为了编译module-info.java,您需要将JAR的内容提取到目录中.然后编译module-info.java,并将输出目录(-d)设置为解压缩内容的目录.对于不维护的JAR文件执行此操作当然有点不太酷,最好让库的维护者将其迁移到显式模块. (6认同)
  • Joda-Time会在某个时候添加一个module-info.class,你只需要注意发布.模块名称为`org.joda.time`. (5认同)
  • 虽然我会等待你克隆的回购的所有者想出一些他已经试图克服同样的东西.[@khmarbaise](/sf/users/20742991/) (2认同)

Gun*_*nar 6

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

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