JUnit使用了错误的Base64

时间:2012-10-05 16:36:44

标签: eclipse junit websphere base64

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

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

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:   组织/阿帕奇/公地/编解码器/二进制/ Base64.decodeBase64(Ljava /郎/字符串;)

疯狂的是,只有当我选择一个Test并在Eclipse中运行Run As:JUnit Test时才会运行它,如果我使用Maven运行整个事情就可以了。

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

2 个答案:

答案 0 :(得分: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项目的依赖项。

不幸的是,解决该问题的方法并不多(简单)。一种是从Java项目中删除com.ibm.ws.prereq.soap.jar(我怀疑你实际上是在使用Apache SOAP)。另一种方法是更改​​顺序,以便您的其他commons-codec依赖关系出现在com.ibm.ws.prereq.soap.jar之前。

答案 1 :(得分:0)

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