项目场景:
SA 的BOSS系统有后台任务,系统使用SpringTask + Javamail实现将客户的下月账单发送到客户邮箱中,升级系统后发现后台有报错
java.lang.LinkageError: loader constraints violated when linking
原因分析:
LinkageError异常准确的说他是一个错误, 因为他是 Error类的子类,Java API对Error的描述,只有LinkageError的解释:
Subclasses of LinkageError indicate that a class has some dependency on another class; however, the latter class has incompatibly changed after the compilation of the former class.
大概意思为,ERROR 的子类LinkageError的异常提示发生一个类对另一个类具有某种依赖关系, 但是依赖的类在编译后发生了不兼容的改变,例如编译时候A类依赖B类,到运行时,A类得到的B类(既某个类加载器加载的B类)却发现B类已经变成了不兼容的类,无法满足依赖关系
通过异常日志发现问题 出现在javamail的MimeMessageHelper#addAttachment方法中,查看代码发现是可能是 javax.activation.DataHandler引起, 此类位于activation-1.1.jar 包中
最后考虑到会不会是JBOSS环境中第三方包影响,因此核实第三方包,发现BOSS中使用的第3方包activation.jar和activation-1.1.jar冲突。两个包冲突引起依赖问题
解决方案:
activation-1.1.jar是解决一个业务需求时增加,核实代码此业务需求activation.jar完全可用,删除activation-1.1.jar后问题解决