如何解决javax.activation包同时被jakarta.activation与java.activation读取的报错
问题触发的核心原因
该报错属于Java 9+ JPMS(Java平台模块系统)的包拆分冲突:javax.activation 包同时被 jakarta.activation 和旧版 java.activation 两个依赖模块提供,org.apache.commons.compress 读取该包时无法确定优先来源,触发冲突。
报错原文:
java: module org.apache.commons.compress reads package javax.activation from both jakarta.activation and java.activation
可落地的修复方案
- 方案1:全局排除旧版
java.activation依赖(优先推荐)
Maven配置(添加到commons-compress依赖的声明中):
Gradle配置:<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>你当前使用的commons-compress版本号</version> <exclusions> <!-- 排除旧的javax.activation实现 --> <exclusion> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> </exclusion> <exclusion> <groupId>com.sun.activation</groupId> <artifactId>javax.activation</artifactId> </exclusion> </exclusions> </dependency>implementation("org.apache.commons:commons-compress:你当前使用的commons-compress版本号") { exclude group: 'javax.activation', module: 'activation' exclude group: 'com.sun.activation', module: 'javax.activation' } - 方案2:统一activation依赖版本
如果项目中其他组件必须依赖旧版activation,主动全局声明统一的activation依赖:
若适配Jakarta EE规范,引入最新的jakarta.activation-api包,覆盖所有传递引入的旧版activation依赖即可。 - 方案3:模块声明中指定优先来源
项目使用JPMS模块系统(存在module-info.java文件)的场景,直接在模块声明中指定优先读取的模块:module your.module.name { requires org.apache.commons.compress; // 明确指定commons-compress优先读取jakarta.activation提供的javax.activation包 requires jakarta.activation; } - 方案4:临时调试用JVM参数
仅做本地调试验证时,添加JVM启动参数强制允许包拆分:--add-exports jakarta.activation/javax.activation=org.apache.commons.compress
内容的提问来源于stack exchange,提问作者IsaacLevon
相关产品推荐
相关产品推荐

