我知道很多主题都是关于类路径加载器和传递依赖性的,但我有点困惑。
我正在开发一个使用spring 2.0.5和spring-ws的遗留应用程序,从项目开始到现在一切正常。 最近我们遇到了一个运行时问题,例如methodnotfoundexception。
事实上我们看到spring-ws依赖于spring-2.5。所以maven transitive dependancy在spring 2.0.5附近的webinf / lib目录中添加了spring 2.5。
但是我不明白为什么所有工作都很好,多年来为什么weblogic决定在spring2.0.5之前加载spring2.5并导致这个错误?
我们已经纠正了问题,现在我正在寻找具有不同版本的同一个jar,并且当我有一个conflit时会构建失败以避免将来出现依赖性问题。
但我只是想了解为什么weblogic决定加载一个或另一个jar?因为如果按字母顺序排列,同样的jar会一直加载,但在我的例子中更改顺序... 所以我不明白发生了什么事。
先谢谢;)
答案 0 :(得分:2)
虽然有文档证明WEB-INF/classes
在WEB-INF/lib
之前加载,但文档在像您这样的情况下并不明确 - 在WEB-INF/lib
中有Spring的兄弟副本。
在Tomcat中,它是按字母顺序排列的,但看起来像Websphere,Jboss和Weblogic是随机的。见https://stackoverflow.com/a/5817890/327426
在Oracle论坛的某些主题中,建议在http://docs.oracle.com/cd/E23943_01/web.1111/e13706/classloading.htm#BABHJGJJ为您的应用运行类加载器分析工具并查看结果。该工具将识别类加载冲突。
在https://community.oracle.com/thread/2387921?tstart=0
上查看类似问题2009年来自Weblogic v9.2的http://www.coderanch.com/t/472496/BEA-Weblogic/Loading-order-jar-WEB-INF的帖子说明"检查日志我看到WEB-INF / lib中的.jars按反向字母顺序加载"。这可能适用于您的版本
,也可能不适用另一种选择是使用Maven绕过WAR中打包的传递导入