JavaFX项目用jlink打包遇java.xml.bind模块依赖错误求助
问题根源
Java 9及以后版本彻底移除了Java EE相关模块(包括java.activation和java.xml.bind),这些功能现在以第三方库的形式提供。你使用的jaxb-api:2.3.1依赖java.activation模块,但你下载的jaf-1.1.1不是模块化版本(无module-info.java),导致jlink无法将其识别为java.activation模块。
解决方案一:使用模块化的Java Activation Framework版本
这是最规范的解决方式,使用官方提供的模块化JAF版本:
获取模块化JAF jar包
下载javax.activation-api:1.2.0(该版本包含module-info.java,模块名正是java.activation)。若使用Maven,可添加以下依赖自动下载:<dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>本地路径通常为
C:\Users\alex_\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar更新module-info.java
添加对java.activation的显式依赖:module org.aned.mosaic { exports mosaic; requires java.logging; requires org.apache.commons.lang3; requires java.xml.bind; requires java.activation; // 新增依赖声明 requires java.desktop; requires transitive javafx.graphics; requires transitive javafx.controls; requires transitive javafx.fxml; }修改jlink命令
将javax.activation-api-1.2.0.jar的路径加入--module-path:jlink --output output/image --module-path "output/modules;C:\Program Files\Java\javafx-sdk-19\lib;C:\Users\alex_\.m2\repository\org\apache\commons\commons-lang3\3.12.0\commons-lang3-3.12.0.jar;C:\Users\alex_\.m2\repository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;C:\Users\alex_\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar" --add-modules org.aned.mosaic --launcher Mosaic=org.aned.mosaic
解决方案二:将非模块化JAF作为自动模块使用
若你坚持使用jaf-1.1.1的activation.jar,可将其作为自动模块处理:
优化jar包命名(可选)
将activation-1.1.1.jar重命名为activation.jar,避免版本号干扰自动模块名(自动模块名默认是jar文件名去掉后缀)。更新module-info.java
依赖声明改为自动模块名:module org.aned.mosaic { exports mosaic; requires java.logging; requires org.apache.commons.lang3; requires java.xml.bind; requires activation; // 使用自动模块名 requires java.desktop; requires transitive javafx.graphics; requires transitive javafx.controls; requires transitive javafx.fxml; }修改jlink命令
将activation.jar的路径加入--module-path:jlink --output output/image --module-path "output/modules;C:\Program Files\Java\javafx-sdk-19\lib;C:\Users\alex_\.m2\repository\org\apache\commons\commons-lang3\3.12.0\commons-lang3-3.12.0.jar;C:\Users\alex_\.m2\repository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;C:\你的路径\activation.jar" --add-modules org.aned.mosaic --launcher Mosaic=org.aned.mosaic
额外注意事项
- 确保所有依赖的jar包都被包含在
--module-path中,jlink只会从指定路径查找模块。 - 若后续遇到
javax.xml.bind.JAXBContext找不到的问题,还需添加JAXB实现库(如org.glassfish.jaxb:jaxb-runtime:2.3.1)到module-path,并在module-info.java中添加requires jaxb.runtime;声明。
内容的提问来源于stack exchange,提问作者Alexandre Nedjari

