2012-03-05 42 views
1

我正在將常規J2EE應用程序轉換爲使用Maven。我能夠成功轉換爲Maven,並且我獲得了成功的「mvn deploy」。在將耳朵部署到WAS之後,這個問題正在面臨。我得到 SRVE0203E:Servlet [action] org.apache.struts.action.ActionServlet缺少另一個必需的類。哪些罐子需要存在於WEB-INF lib和.classpath中

我對於不同的應用程序有類似的問題,並且在嘗試了幾次「排除」jar之後,我能夠在WAS中成功部署應用程序。我有以下問題。

  1. 我們怎樣才能確定所有jar需要在WEB-inf \ lib文件夾中出現?

  2. 我們如何確定所有罐子需要在戰爭meta-inf的.class路徑中出現。

  3. 我們怎麼能確定,即使罐子中的.classpath提及,但並非強制性的,它需要存在於WEB-INF \ lib中(即類加載器將拉動從耳朵而不是戰爭)的戰爭將工作

僅供參考我使用J2EE 1.4

回答

2
在集裝箱執行

Java EE應用程序有幾個層次組成的類路徑:

  1. Web應用程序的類路徑,repres由JAR和類文件ented包含在WEB-INF/lib中
  2. 企業應用的類路徑,其包括在EAR水平
  3. 容器類路徑聲明的JAR文件,包含WebSphere運行時和共享庫

有是這些級別之間複雜的依賴關係規則,但主要思想是所有應用程序庫必須包含在這些級別之間,以避免可能破壞類路徑的任何衝突。

考慮到這一點,一個簡單的方法是將所有的應用程序JAR放在WEB-INF/lib中。如果你的EAR有兩個Web模塊,每個模塊都需要它自己的一套JARS。一個更強大的方法是將常用的JAR包含在EAR級別,這樣可以避免JAR的重複性。

如果您的公司有一個所有應用程序都使用的專有框架,那麼在公司的每個EAR應用程序中都包含相同的JARS是很愚蠢的。更好的方法是將公司框架配置爲Container中的共享庫,以便所有應用程序都可以重複使用它。

總之,確定Java EE應用程序類路徑有幾個因素。你應該記住總是避免重複和版本衝突,所以你的應用可以順利地解決它的依賴關係。

+0

嗨卡洛斯非常感謝您的建議。這是我正在運行的。 1.如果我是對的,那麼在耳朵和戰爭中複製罐子都會導致課堂加載問題。 2.例如,如果我在我的web-inf lib中使用了struts.jar這樣的jar,那麼避免ear和war中的重複的最好方法是什麼,因爲struts可能會引入一些額外的傳遞依賴jar。所以如果我們排除其他傳遞性依賴關係在部署說明所需類之後失敗,但在調用struts時不可用。我仍然有這個問題,我不知道如何解決這個問題。 – techrawther 2012-03-13 01:35:49

+0

您的企業應用程序有多少個Web模塊?如果它只有一個模塊,那麼最好的辦法就是將Struts及其所有依賴關係放在WEB-INF庫中,這樣就不會混淆其他模塊的類路徑 – 2012-03-13 02:13:00

+0

我有3個Web模塊並複製了所有的jar文件所有的3個戰爭文件將會佔用空間。 – techrawther 2012-03-15 01:26:18