Maven项目用jlink创建自定义JRE遇自动模块错误的解决咨询
解决jlink无法处理自动模块(httpcore)的问题
问题根源
jlink只能构建由显式模块(带module-info.java的JAR)组成的自定义JRE,你用的httpcore 4.4.13是老的非模块化JAR,会被JVM识别成自动模块,这类模块不被jlink支持。你之前设置的<automaticModuleName>true</automaticModuleName>完全错了——这个参数要填合法的模块名,不是true,但哪怕填对了,自动模块照样过不了jlink这关。
两种解决办法
办法一:升级HttpCore到模块化版本
HttpCore从5.0版本开始就自带module-info.java了,直接换版本最省心:
把pom.xml里的httpcore依赖改成这样(注意groupId有变化):
<dependency> <groupId>org.apache.httpcomponents.core</groupId> <artifactId>httpcore</artifactId> <version>5.2.4</version> <!-- 可替换为最新稳定版 --> </dependency>
改完之后重新执行mvn clean javafx:jlink即可,新的httpcore是显式模块,jlink能直接处理。
办法二:给老版本HttpCore补模块信息(不升级)
如果没法升级依赖,就用moditect-maven-plugin给httpcore的JAR手动添加module-info.java,把它转成显式模块:
- 在
pom.xml的<build><plugins>中添加该插件(要放在JavaFX插件前面):
<plugin> <groupId>org.moditect</groupId> <artifactId>moditect-maven-plugin</artifactId> <version>1.0.0.Final</version> <executions> <execution> <id>add-httpcore-module-info</id> <phase>package</phase> <goals> <goal>add-module-info</goal> </goals> <configuration> <modules> <module> <artifact> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4.13</version> </artifact> <moduleInfo> <name>org.apache.httpcomponents.httpcore</name> <exports>org.apache.http.*</exports> <requires java.base>true</requires> </moduleInfo> </module> </modules> </configuration> </execution> </executions> </plugin>
- 在你的
module-info.java里添加对该模块的依赖:
module 你的模块名 { requires javafx.controls; requires javafx.fxml; // 新增这一行 requires org.apache.httpcomponents.httpcore; opens 你的主类所在包 to javafx.fxml; exports 你的主类所在包; }
- 最后重新执行
mvn clean javafx:jlink,插件会先给httpcore补好模块信息,再由jlink完成自定义JRE的打包。
内容的提问来源于stack exchange,提问作者void
相关产品推荐
相关产品推荐

