Java Weblogic 10.3类加载器问题

Java Weblogic 10.3类加载器问题,java,maven,classpath,weblogic-10.x,maven-war-plugin,Java,Maven,Classpath,Weblogic 10.x,Maven War Plugin,摘要 它的应用程序在结构上并没有改变,也并没有任何代码改变,现在遇到了类路径问题。唯一改变的是它的内置环境(新的solaris机箱) 应用服务器:weblogic 10.3 Maven war插件:2.3 错误 在应用程序war中有两个依赖项,它们具有同一类的不同版本,其中一个版本缺少某个构造函数……您可以看到这是怎么回事。我们得到了一个运行时错误,因为目标类的错误版本(缺少构造函数) 现在,这是一个maven项目,依赖项的排序方式是,在编译时,该类的正确版本将首先出现在类路径上 就我们现在所知

摘要

它的应用程序在结构上并没有改变,也并没有任何代码改变,现在遇到了类路径问题。唯一改变的是它的内置环境(新的solaris机箱)

应用服务器:weblogic 10.3

Maven war插件:2.3

错误

在应用程序war中有两个依赖项,它们具有同一类的不同版本,其中一个版本缺少某个构造函数……您可以看到这是怎么回事。我们得到了一个运行时错误,因为目标类的错误版本(缺少构造函数)

现在,这是一个maven项目,依赖项的排序方式是,在编译时,该类的正确版本将首先出现在类路径上

就我们现在所知,所有已经改变的是新的构建框,构建部门在其上构建war文件

测试完成

如果我在自己的本地环境(windows)上创建war并将其部署到weblogic环境服务器(unix box),则不会出现问题

但是,当它构建在构建箱(solaris)上,然后我将其部署到相同的环境中时,我就遇到了问题

我比较了两份战争文件,没有发现任何差异

为了证实我的怀疑(在类路径上首先命中错误的类),我构建了一个包,排除了错误的版本,它居然可以工作。weblogic类加载器显然是在加载这个不正确的类之前加载另一个

问题仍然存在,我需要找出现在突然发生的原因

问题

weblogic的类加载器的规则是什么,决定首先加载lib中的哪个依赖项

除了清单中的版本号之外,两次完全相同的战争之间,这种行为如何可能发生变化

非常感谢,

用户编辑

根据Maven依赖关系树的要求:

[INFO] com.xxx.web:adminapp:war:100462.7
[INFO] +- junit:junit:jar:4.11:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- struts:struts:jar:1.2.4:compile
[INFO] |  +- commons-beanutils:commons-beanutils:jar:1.6.1:compile
[INFO] |  +- commons-collections:commons-collections:jar:2.1:compile
[INFO] |  +- commons-digester:commons-digester:jar:1.5:compile
[INFO] |  |  \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] |  +- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] |  +- commons-validator:commons-validator:jar:1.1.3:compile
[INFO] |  +- oro:oro:jar:2.0.7:compile
[INFO] |  +- antlr:antlr:jar:2.7.2:compile
[INFO] |  \- commons-lang:commons-lang:jar:2.6:compile (version managed from 2.0)
[INFO] +- displaytag:displaytag:jar:1.2:compile
[INFO] |  +- com.lowagie:itext:jar:1.3:compile
[INFO] |  +- org.slf4j:jcl104-over-slf4j:jar:1.4.2:compile
[INFO] |  \- org.slf4j:slf4j-log4j12:jar:1.4.2:compile
[INFO] |     +- org.slf4j:slf4j-api:jar:1.4.2:compile
[INFO] |     \- log4j:log4j:jar:1.2.13:compile
[INFO] +- taglibs:request:jar:1.0.1:compile
[INFO] +- org.apache.poi:poi:jar:3.8:compile
[INFO] |  \- commons-codec:commons-codec:jar:1.4:compile (version managed from 1.5)
[INFO] +- javax.servlet:servlet-api:jar:2.5:provided
[INFO] +- javax.servlet:jsp-api:jar:2.0:provided
[INFO] +- com.xxx.busservices:cdm:jar:623377.7:compile
[INFO] +- com.xxx.busservices:homeratingservice-java-client:jar:1011147.2:compile
[INFO] +- com.xxx.busservices:motorratingservice-java-client:jar:1011147.2:compile
[INFO] +- com.xxx.techservices:entrefdata-java-client:jar:1011147.2:compile
[INFO] +- com.xxx.techservices:auditservice-java-client:jar:626434.4:compile
[INFO] +- com.xxx.framework:framework:jar:626434.4:compile
[INFO] +- com.xxx.ibis:xxx-logging:jar:956942.1:compile
[INFO] +- weblogic:wlfullclient:jar:10.3:provided
[INFO] +- commons-fileupload:commons-fileupload:jar:1.2.2:compile
[INFO] \- commons-io:commons-io:jar:2.1:compile

cdm.jar
包含一个名为FactorValueLite的类,它是正确的版本,并且在
motorratingservice java客户端中。jar
也存在这个类,它是错误的版本,这个jar似乎首先加载到类路径上。

我怀疑您的本地存储库中有过时的工件(在你正在建造的机器上)它出故障的地方

尝试将其删除,或指定其他路径(只是为了测试)。例如:

mvn clean package -Dmaven.repo.local=/tmp/repository

如果通过,那么修复很简单:删除存储库。

您可以获得URL
Class.getProtectionDomain().getCodeSource().getLocation()
(“文件:jar:…”)对于使用过的jar。我猜是不同的jar,一个在应用服务器的lib目录中。

您可以使用dependency/exclusions从构建中排除您知道包含错误类的依赖项吗…?如果您不能,也许可以帮上忙。我已经这样做了,以证明这是一个问题,但是为什么突然之间这是一个问题呢我想找出什么。你比较过两个环境中JVM的版本吗?只能怀疑它们以不同的方式执行类路径搜索。我排除了这一点,因为目前,我有两个版本的源代码以相同的方式构建(通过jenkins)唯一的区别是版本号,其中一个有效,另一个无效。两者都运行在同一台机器上。我比较了工作war和不工作war中工件的校验和,两者完全相同。请提供有关具有
NoSuchMethodError
(提供名称、找到它的工件等)。另外,附加一个构建war工件的项目的
mvn依赖项:树
。在您将工件部署到的主机上,作为web应用程序容器的一部分的库是否存在差异?weblogic上没有涉及这些类的共享库。好的,所以尝试将
cdm
依赖项作为第一个
在您的
部分中。我怀疑这会解决问题,但尝试一下只是为了好玩。或者,只需从
motorratingservice java客户端
依赖项中删除重复的类。如果
motorratingservice java客户端
是一个着色jar,您可能需要将其依赖项更新为工件w它包含类(除非它直接在那个jar中)。