2012-10-05 31 views
0

我想從commons-codec 1.5使用Base64類,當我在服務器上運行代碼時,這很好。我的應用程序運行在Websphere 7.0上。JUnit使用錯誤的Base64

但是當我運行我的JUnit測試錯誤Base64編碼類是choosen,當我詢問學生有:

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

輸出爲:文件:/ C:/ EProg/IBM/SDP80 /運行時間/base_v7/plugins/com.ibm.ws.prereq.soap.jar

這就是錯誤的版本。

並出現因爲錯誤版本的錯誤:

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

瘋狂的事情是,出現這種情況只有它我選擇一個試驗及運行方式運行:在Eclipse JUnit測試,如果我跑了整個Maven everthing的工作正常。

我使用JUnit 4.8.1和Eclipse靛藍服務發佈2與一些插件對於WebSphere,GWT和Maven.``

回答

3

com.ibm.ws.prereq.soap.jar是一個OSGi包,並在WebSphere(這是建立一個OSGi容器上),因爲這個包不是由OSGi bundle導出在org.apache.commons.codec.binary類是不應用程序可見(你可以檢查的導出列表通過查看com.ibm.ws.prereq.soap.jar中的META-INF/MANIFEST.MF文件)。這就解釋了爲什麼在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之前。

0

它看起來像一個類路徑的問題。更確切地說,Eclipse與Maven集成。我會調查Eclipse依賴關係,並確保它使用Maven進行依賴關係管理。 您可以通過兩種方式來完成,您可以運行mvn eclipse:eclipse命令或使用M2Eclipse插件。如果使用後者,則在項目上下文菜單中會有一個更新依賴項選項。

+0

我使用M2E,並在Maven的依賴文件夾/容器everthing似乎是好的。而且我使用Maven運行JUnit測試。但是當我使用Eclipse/JUnit運行它們時,它使用了錯誤的Base64類。我還沒有找到一個地方在Eclipse中配置JUnit以僅使用Maven依賴關係。我想用Eclipse/JUnit運行它的原因是因爲我想調試我的測試。在使用Maven運行JUnit測試時進行調試是一個非常糟糕的解決方案。 –

+0

我想出瞭如何讓JUnit測試運行,但這不是真正的解決方案,它只能幫助我調試測試:右鍵單擊測試所屬的Maven模塊 - > Properties - > Java Build Path - >庫 - >刪除WebSphere Application Server V7.0。現在我可以調試我的測試,但是必須重新添加服務器之後。所以對我來說,這不是處理這個問題的理想方法。 –

+0

我仍然認爲這個問題是因爲Maven與eclipse集成在一起的。 Eclipse不是我的主IDE,所以我可能是錯的,但是你可以嘗試右鍵單擊 - >在「Maven」選項下 - >啓用依賴管理。另外,如果您在POM中添加了服務器依賴項,您是否也可以將範圍更改爲「提供」 –