Java17+JavaFX项目用RestTemplate遇jlink构建错误求解决方案
解决jlink构建时spring.web自动模块的问题
问题原因
jlink工具只能处理带有module-info.class的显式Java模块,而spring-web 6.1.1属于「自动模块」(没有官方提供的模块描述文件),因此jlink会直接报错拒绝使用它。
可行解决方案
方案1:放弃jlink,打包成普通可执行JAR
如果不需要自定义轻量JRE运行时镜像,直接用Maven的jar插件或javafx:jar插件打包成普通可执行JAR,这样就能正常包含spring-web这类自动模块,不会触发jlink的模块校验。
方案2:用Moditect插件将spring-web转换为显式模块
Moditect可以在构建过程中给自动模块生成module-info.class,让jlink能够识别它。具体配置步骤:
在pom.xml中添加Moditect插件,指定处理spring-web依赖并生成模块描述:
<plugin> <groupId>org.moditect</groupId> <artifactId>moditect-maven-plugin</artifactId> <version>1.0.0.Final</version> <executions> <execution> <id>add-module-info</id> <phase>package</phase> <goals> <goal>add-module-info</goal> </goals> <configuration> <modules> <module> <artifact> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>6.1.1</version> </artifact> <moduleInfo> <name>spring.web</name> <exports>org.springframework.web.client</exports> <!-- 根据你实际用到的包添加exports,比如RestTemplate所在的包 --> <requires>java.base</requires> <requires>java.logging</requires> <requires>com.fasterxml.jackson.databind</requires> <!-- 按需添加spring-web依赖的其他模块 --> </moduleInfo> </module> </modules> </configuration> </execution> </executions> </plugin>
配置完成后再运行javafx:jlink,此时spring-web已被转换为显式模块,jlink就能正常处理。
方案3:改用Spring Boot打包(适合JavaFX+Spring结合场景)
如果你的项目本身是JavaFX与Spring Boot的组合,直接使用Spring Boot的Maven插件打包即可,它会将所有依赖打包成可执行JAR或镜像,无需依赖jlink的模块校验逻辑。
内容的提问来源于stack exchange,提问作者Mafei
相关产品推荐
相关产品推荐

