使用Jakarta.Mail调用getContent()出现IllegalAccessError的解决求助
解决Jakarta.Mail调用getContent()时的IllegalAccessError问题
错误原因
这个IllegalAccessError是由于jakarta.activation.MailcapCommandMap试图访问com.sun.activation.registries.LogSupport类,但该类属于Jakarta Activation实现的内部API,因依赖配置错误或类加载器冲突导致无法正常访问。核心问题是Jakarta Activation的API与实现包不匹配,或Tomcat类加载器加载了不兼容的版本。
无需降级的解决办法
1. 确保依赖配置正确(Maven/Gradle)
Jakarta Mail 2.1.1依赖Jakarta Activation 2.1.x版本,需同时引入API包和实现包,且版本保持一致:
Maven配置
<!-- Jakarta Mail API --> <dependency> <groupId>jakarta.mail</groupId> <artifactId>jakarta.mail-api</artifactId> <version>2.1.1</version> </dependency> <!-- Jakarta Mail 实现包(运行时依赖) --> <dependency> <groupId>com.sun.mail</groupId> <artifactId>jakarta.mail</artifactId> <version>2.1.1</version> <scope>runtime</scope> </dependency> <!-- Jakarta Activation API --> <dependency> <groupId>jakarta.activation</groupId> <artifactId>jakarta.activation-api</artifactId> <version>2.1.2</version> </dependency> <!-- Jakarta Activation 实现包(运行时依赖) --> <dependency> <groupId>com.sun.activation</groupId> <artifactId>jakarta.activation</artifactId> <version>2.1.2</version> <scope>runtime</scope> </dependency>
Gradle配置
implementation 'jakarta.mail:jakarta.mail-api:2.1.1' runtimeOnly 'com.sun.mail:jakarta.mail:2.1.1' implementation 'jakarta.activation:jakarta.activation-api:2.1.2' runtimeOnly 'com.sun.activation:jakarta.activation:2.1.2'
2. 排除冲突的旧依赖
检查项目依赖树,确保没有遗留的javax.activation或旧版本的jakarta.activation依赖。例如在Maven中,使用dependency:tree命令查看依赖,然后通过<exclusions>排除冲突项:
<dependency> <!-- 示例:排除某个依赖传递的旧activation --> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <exclusions> <exclusion> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> </exclusion> <exclusion> <groupId>jakarta.activation</groupId> <artifactId>jakarta.activation-api</artifactId> </exclusion> </exclusions> </dependency>
3. 处理Tomcat类加载器冲突
如果部署在Tomcat中,需解决类加载器隔离问题:
- 检查Tomcat的
CATALINA_HOME/lib目录,移除任何javax.activation.jar或旧版本的jakarta.activation*.jar。 - 在项目的
META-INF/context.xml中添加配置,确保项目优先使用自身依赖:<Context> <Loader delegate="false" /> </Context>
4. 模块化项目的配置(JDK 17+)
如果项目是模块化的(使用module-info.java),需在模块声明中添加对Jakarta Activation的依赖:
module your.module.name { requires jakarta.mail; requires jakarta.activation; }
5. 验证类加载路径
启动应用时添加JVM参数-verbose:class,查看jakarta.activation.MailcapCommandMap和com.sun.activation.registries.LogSupport的加载来源,确认是否来自正确的jakarta.activation-2.1.2.jar包。
内容的提问来源于stack exchange,提问作者CreativeWorld
相关产品推荐
相关产品推荐

