WildFly启动失败:air-diffusion.war部署异常原因排查
解决WildFly 8.2.0.Final部署air-diffusion.war时的ClassNotFoundException问题
问题核心
- 部署
air-diffusion.war到WildFly 8.2.0.Final启动失败,核心异常为ClassNotFoundException: com.sun.image.codec.jpeg.ImageFormatException - 该异常导致Spring容器内验证码相关Bean创建失败,进而引发
jboss.undertow.deployment.default-server.default-host./air-diffusion服务启动失败,后续出现连锁依赖缺失问题
原因分析
com.sun.image.codec.jpeg.ImageFormatException是Sun/Oracle JDK的私有API,WildFly默认不会将这类私有API暴露给部署的应用。而且从Java 7开始,这类API已被标记为过时,Java 9及以后版本更是直接移除了相关包,兼容性风险很高。
解决方案
方案1:替换私有API为Java标准API(推荐)
彻底解决兼容性问题,把验证码生成代码里依赖com.sun.image.codec.jpeg包的部分,换成Java标准库的javax.imageio相关类:
- 原代码中使用
JPEGImageEncoder、捕获ImageFormatException的逻辑,改用ImageIO.write()处理JPEG图片,异常捕获替换为IOException即可。
方案2:配置WildFly允许访问私有API(临时 workaround)
如果暂时没法修改代码,可以通过调整WildFly配置让应用访问该私有API,但不推荐长期使用:
- 找到WildFly安装目录下的
modules/system/layers/base/sun/jdk/main/module.xml,在<exports>节点里添加导出项:<exports> <!-- 保留原有导出内容 --> <export module="sun.jdk" name="com.sun.image.codec.jpeg"/> </exports> - 在
air-diffusion.war的WEB-INF目录下创建(如果没有的话)jboss-deployment-structure.xml,添加依赖配置:<jboss-deployment-structure> <deployment> <dependencies> <module name="sun.jdk" export="true"/> </dependencies> </deployment> </jboss-deployment-structure> - 重启WildFly后重新部署应用
内容的提问来源于stack exchange,提问作者M M
相关产品推荐
相关产品推荐

