独立运行正常的邮件发送代码在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,那可以通过配置隔离服务器的内置模块:
- 在你的war包的WEB-INF文件夹里新建
jboss-deployment-structure.xml文件 - 写入以下配置:
这样WildFly就会忽略自带的JavaMail模块,老老实实加载你应用里的版本。<jboss-deployment-structure> <deployment> <exclude-subsystems> <subsystem name="mail"/> </exclude-subsystems> <exclusions> <module name="javax.mail.api"/> </exclusions> </deployment> </jboss-deployment-structure>
为啥本地单独运行没问题?
因为本地测试时,JVM只加载了你自己的javax.mail-1.5.1.jar,没有服务器内置的版本跟它抢,自然不会有冲突~
内容的提问来源于stack exchange,提问作者Nikhil Kumar
相关产品推荐
相关产品推荐

