sbt native-packager运行jdeps报错:找不到java.activation模块求助
根因说明
该报错为Java 11+环境下的模块路径匹配问题:
- Java 11已移除内置的
java.xml.bind、java.activation等Java EE模块,你用到的jaxb-api是模块化Jar,其module-info.class中声明依赖的模块名为java.activation - 你引入的
javax.activation:javax.activation-api属于Java EE阶段的旧版本包,未内置module-info.class,作为自动模块被识别时的模块名为javax.activation.api,和jaxb-api要求的模块名不匹配,因此jdeps扫描阶段会抛出找不到模块的错误。
修复方案
方案1:使用匹配模块名的激活框架依赖(推荐,不破坏原有依赖链)
- 移除之前自行添加的
javax.activation:javax.activation-api依赖 - 在
libraryDependencies中添加如下兼容依赖:
libraryDependencies ++= Seq( "com.sun.xml.bind" % "jaxb-impl" % "2.3.9", "com.sun.activation" % "javax.activation" % "1.2.0" )
该版本的javax.activation包声明的模块名即为java.activation,完全匹配jaxb-api的依赖要求。
3. 若你在sbt native packager中开启了显式模块声明,需在jlink配置中追加对应模块:
jlinkModules += "java.activation"
方案2:排除冗余jaxb依赖(适合无需xml绑定功能的场景)
如果你的业务代码不会用到Pi4j传递引入的xml绑定能力,你当前排除javax.xml.bind的方案是安全的,不会导致运行缺失依赖,只需在依赖声明中显式标注排除即可:
libraryDependencies += "com.pi4j" % "pi4j-core" % "1.4" exclude("javax.xml.bind", "jaxb-api")
若后续运行真的出现类缺失报错,再补充方案1的依赖即可。
内容的提问来源于stack exchange,提问作者0__
相关产品推荐
相关产品推荐

