0

我想使用 commons-codec 1.5 中的 Base64 类,当我在服务器上运行代码时效果很好。我的应用程序在 Websphere 7.0 上运行。

但是当我运行我的 JUnit 测试时,选择了错误的 Base64 类,当我询问该类时:

System.out.println(Base64.class.getProtectionDomain().getCodeSource().getLocation());

输出为:file:/C:/EProg/IBM/SDP80/runtimes/base_v7/plugins/com.ibm.ws.prereq.soap.jar

那绝对是错误的版本。

并且由于版本错误而发生错误:

java.lang.NoSuchMethodError: org/apache/commons/codec/binary/Base64.decodeBase64(Ljava/lang/String;)

疯狂的是,只有当我选择一个测试并在 Eclipse 中使用 Run As: JUnit Test 运行它时才会发生这种情况,如果我使用 Maven 运行整个测试,一切都可以正常工作。

我使用 JUnit 4.8.1 和 Eclipse Indigo Service Release 2 以及一些用于 Websphere、GWT 和 Maven 的插件。``

4

2 回答 2

3

com.ibm.ws.prereq.soap.jar是一个 OSGi 包,并且在 WebSphere(构建在 OSGi 容器上)中,其中的类org.apache.commons.codec.binary对应用程序不可见,因为该包不是由 OSGi 包导出的(您可以通过查看META-INF/MANIFEST.MF文件来检查导出包的列表中com.ibm.ws.prereq.soap.jar)。这就解释了为什么在 WebSphere 中运行应用程序时不会遇到任何问题。

另一方面,当您将该 JAR 添加到 Eclipse 中的 Java 项目时,它将被视为一个简单的 JAR,而不是 OSGi 包,并且所有包都将可见。commons-codec在您的情况下,这会与另一个依赖项产生冲突。

我猜你在 Maven 中没有遇到这个问题的原因是这com.ibm.ws.prereq.soap.jar只是你的 Eclipse 项目的依赖,而不是你的 Maven 项目的依赖。

不幸的是,解决这个问题的方法并不多(简单)。一种是com.ibm.ws.prereq.soap.jar从您的 Java 项目中删除(我怀疑您实际上是在使用 Apache SOAP)。另一种是改变顺序,让你的其他commons-codec依赖在前面com.ibm.ws.prereq.soap.jar

于 2012-10-06T18:06:27.090 回答
0

它看起来像一个类路径问题。更准确地说,Eclipse 与 Maven 的集成。我将调查 Eclipse 依赖项并确保它使用 Maven 进行依赖项管理。您可以通过两种方式进行操作,您可以运行 mvn eclipse:eclipse 命令或使用 M2Eclipse 插件。如果您使用后者,则在项目上下文菜单中有一个更新依赖项选项。

于 2012-10-05T16:40:33.760 回答