2

概括

其应用程序在结构上未更改或任何代码更改,现在遇到类路径问题。唯一改变的是它所在的环境(新的solaris box)。

应用服务器:weblogic 10.3

Maven 战争插件:2.3

错误

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

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

据我们目前所知,所有改变的只是新的构建框,构建部门在其上构建战争文件。

测试完成

如果我在自己的本地环境(windows)上创建战争并将其部署到 weblogic 环境服务器(unix 框),没问题。

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

我比较了两个war文件,没有发现任何差异。

为了确认我的怀疑(首先在类路径上打错了类),我构建了不包括错误版本的包,令人惊讶的是它可以工作。weblogic 类加载器显然在另一个之前加载了这个不正确的类。

问题仍然存在,我需要确定现在突然发生这种情况的原因。

问题

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

除了 MANIFEST 中的版本号之外,这种行为怎么可能在两个完全相同的不同战争之间发生变化?

非常感谢,

用户编辑

根据 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-client.jar存在这个错误版本的类,这个 jar 似乎首先被加载到类路径中。

4

2 回答 2

1

我怀疑你的本地存储库(在你正在构建的机器上)有过时的工件,它失败了。

尝试删除它,或指定不同的路径(只是为了测试)。例如:

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

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

于 2013-03-05T12:22:36.580 回答
0

您可以获取Class.getProtectionDomain().getCodeSource().getLocation()使用的 jar 的 URL(“file:jar:...”)。我的猜测是应用服务器的 lib 目录中有不同的 jar。

于 2013-03-05T15:11:24.767 回答