簡體   English   中英

一場戰爭中的階級無法在同一個耳朵的另一場戰爭中進入階級

[英]Class in one war not able to access classes in another war of same ear

我有一個包含2個war文件的ear,其中一個包含junit類,另一個包含junits引用的實際應用程序類。 現在執行junits時,我得到一個java.lang.NoClassDefFoundError

是否由於junit類文件位於不同的耳朵,因此無法訪問位於另一個耳朵的應用程序類文件?

要么

這是否是由於部署問題,雖然我能夠運行應用程序以及一些獨立於另一個耳中的應用程序類的仲裁?

根據嚴格的JavaEE可見性語義,WAR內的類不應對同一EAR的其他組件可見。 JBoss放松了這一點,並試圖壓縮類加載層次結構以減少它的刺激性,但WAR限制仍然存在。

我使用的解決方案是只將Web資源放入WAR中,並將WAR的類文件放入EAR內的單獨JAR中。 這樣,webapp本身就可以找到類,所以你的單元也可以測試webapp。

正確的方法是將公共類移動到專用JAR中,並將其綁定到EAR級別。 所以你將有這樣的結構:

  • 業務邏輯-JAR
  • 主web-app的戰爭
  • 測試web應用程序戰
  • 應用耳

您可以將JAR以及您依賴的任何其他庫捆綁在EAR中,並使用WAR的清單文件引用它們。 在MANIFEST.MF中,它看起來像:

Class-Path: business-logic-1.0.jar spring-2.5.5.jar ...

您仍然可以在每個WAR的WEB-INF / lib文件夾中捆綁其他JAR,例如test-web-app-war中的junit。 如果您正在使用Maven,請閱讀瘦的戰爭頁面以獲取一般方法。

JUnit類不屬於WAR或EAR文件。 不應該部署它們。

您沒有說明您正在使用哪個應用服務器,但如果您使用WebLogic,則可以將所有.class文件放入APP-INF / classes。 它們將在EAR級別可見,因此所有WAR都可以看到它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM