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

独立运行正常的邮件发送代码在WildFly中抛出IllegalAccessError问题

解决WildFly 8.1.0中JavaMail IllegalAccessError问题

这个错误我太熟了!你遇到的java.lang.IllegalAccessError: tried to access class javax.mail.Session$1 from class javax.mail.Session本质是类加载冲突——WildFly 8.1.0本身已经内置了JavaMail的实现(属于Java EE规范的标配组件),但你的应用又自己打包了javax.mail-1.5.1.jar,两个不同来源的JavaMail类在JVM里互相干扰,导致Session类的内部匿名类(Session$1)的访问权限校验失败。

下面是两种靠谱的解决办法,按优先级推荐:

方案1:移除应用里打包的JavaMail依赖(最推荐)

WildFly自带的JavaMail完全能满足需求,没必要自己带一份。

  • 如果用Maven/Gradle构建,把javax.mail依赖的scope改成provided,这样打包时不会把jar包打进war/ear,直接用服务器内置的版本:
    Maven示例代码:
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>javax.mail-api</artifactId>
        <version>1.5.1</version>
        <scope>provided</scope>
    </dependency>
    
    (要是你用的是mail这个artifactId,同样把scope设为provided就行)
  • 手动打包的话,直接删掉war包WEB-INF/lib目录下的javax.mail-1.5.1.jar。

方案2:让WildFly优先加载应用的JavaMail版本(特殊场景用)

如果因为业务必须保留应用内的JavaMail jar,那可以通过配置隔离服务器的内置模块:

  1. 在你的war包的WEB-INF文件夹里新建jboss-deployment-structure.xml文件
  2. 写入以下配置:
    <jboss-deployment-structure>
        <deployment>
            <exclude-subsystems>
                <subsystem name="mail"/>
            </exclude-subsystems>
            <exclusions>
                <module name="javax.mail.api"/>
            </exclusions>
        </deployment>
    </jboss-deployment-structure>
    
    这样WildFly就会忽略自带的JavaMail模块,老老实实加载你应用里的版本。

为啥本地单独运行没问题?

因为本地测试时,JVM只加载了你自己的javax.mail-1.5.1.jar,没有服务器内置的版本跟它抢,自然不会有冲突~

内容的提问来源于stack exchange,提问作者Nikhil Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:12:33