我想使用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的插件.`
答案 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插件。如果使用更高版本,则在项目上下文菜单中有一个更新依赖项选项。