24

我有一个依赖于自动模块的显式模块化项目;例如在 java.activation 上。仍然可以使用jlink吗?

请参阅此模块信息.java:

module hello {
    requires java.activation;
}

那么jlink无法添加模块:

$ jlink --module-path target/modules --add-modules hello --output target/jlink
Error: automatic module cannot be used with jlink: java.activation from file:///C:/Development/jlinkExample/target/modules/javax.activation-api-1.2.0.jar

据我了解,自动模块无论如何都会包含整个类路径。所以我想用 jlink 创建运行时映像没有任何好处?

另请参阅:什么是自动模块?

有没有可能规避这个问题?也许为这些依赖项生成一个 module-info.java ?

4

1 回答 1

1

据我了解,自动模块无论如何都会包含整个类路径,所以我想用 jlink 创建运行时映像没有任何好处?

不,自动模块不会包含整个类路径。事实上,没有明确定义为模块(包含module-info.java)但在模块路径中找到的工件被视为自动模块,以弥合显式模块和类路径代码之间的差距。

有没有可能绕过这个问题,也许为这些依赖项生成一个模块信息?

是的,您可以创建一个module-info.javawithjdeps或使用moditect 之类的插件来为模块生成模块信息并将其注入您现有的 JAR。

一旦工件(JAR)有一个明确的模块声明,jlink应该接受它而不会失败。

于 2020-08-28T05:03:02.567 回答