You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 20:39:19