2010-10-14 33 views
3

到目前爲止,我們一直在使用WAS 6.1來部署我們的網絡應用程序。現在我們需要遷移到經濟型Tomcat + OpenEJB解決方案。 OpenEJB 3.1.2容器插入到Tomcat 6.18中,這裏沒有獨立的OpenEJB服務器。OpenEJB上的EJB 2.0 - 我在哪裏放置所需的罐子?

所以在這裏我,想我的部署EJB 2.1的對象爲OpenEJB的...

我的問題是,EJB的代碼需要外部.jar庫,我不知道往哪裏放他們,使他們實際上被考慮到容器的類路徑中。它可以正常工作到catalina.home/lib中,所以它會插入到openejb.home/lib中。但是我仍然想找出一種方法來打包EJB,這樣就可以很容易地將它們的鏈接.jar放到適當的位置,供OpenEJB容器使用。

它可以包括用正確的描述符文件構建.ear或.jar ...任何工作的解決方案對我來說都足夠好。

可能有人可以幫忙嗎?

+0

我覺得TOMCAT_HOME/lib目錄就是去避免任何類加載器問題的方式。見http://usna86-techbits.blogspot.com/2009/12/tomcat-openejb-and-jersey-oh-my.html – JoseK 2010-10-14 09:21:28

+0

@JoseK我認爲,特別是問題涉及到包括在webapp的javax庫。其中大多數是通過OpenEJB附帶的javaee-api jar添加的。其他第三方庫應該沒問題。如果你有其他經歷,絕對讓我知道。 – 2010-10-14 11:07:00

回答

4

耳法

你只需拖放到Tomcat的webapps /目錄下,它會有所回升。

例耳(有效):

myapplication.ear 
    lib/ 
    lib/libraryOne.jar 
    lib/libraryTwo.jar 
    redEjbs.jar 
    blueEjbs.jar 

常見錯誤(無效):

myapplication.ear 
    libraryOne.jar (err. not a javaee module) 
    libraryTwo.jar (err. not a javaee module) 
    redEjbs.jar 
    blueEjbs.jar 

只有Java EE的模塊在根允許的。這些是EJB jar,.war文件,Connector .rar文件和Application Client jar。在Java EE 5之前,庫必須在application.xml文件中明確列出。 Java EE 5和轉發,他們可以被添加到一個lib /目錄,並被理解爲只是簡單的jar而不是Java EE模塊。

倒塌EAR辦法

在OpenEJB的/ Tomcat的,你可以把你所有的庫到war文件,且無耳的概念。這是現在的Java EE的一部分6.

mywebapp.war 
    WEB-INF/lib/libraryOne.jar 
    WEB-INF/lib/libraryTwo.jar 
    WEB-INF/lib/redEjbs.jar 
    WEB-INF/lib/blueEjbs.jar 

常見錯誤,包括技術規範:

mywebapp.war 
    WEB-INF/lib/javax.ejb.jar (err. clashes with the related system library) 
    WEB-INF/lib/libraryOne.jar 
    WEB-INF/lib/libraryTwo.jar 
    WEB-INF/lib/redEjbs.jar 
    WEB-INF/lib/blueEjbs.jar 

不聽起來這是問題,但增加的完整性。

常見錯誤,破損的依賴關係:

tomcat/lib/libraryTwo.jar 

mywebapp.war 
    WEB-INF/lib/libraryOne.jar 
    WEB-INF/lib/redEjbs.jar 
    WEB-INF/lib/blueEjbs.jar 

以上是不是從規範的角度無效,是不可能的服務器來檢測,但仍可能會導致應用程序無法正常加載。如果libraryTwo.jar需要libraryOne.jar中的類,那麼這個應用程序將永遠不會工作,因爲Tomcat「lib」類加載器無法看到來自「webapp」類加載器的類,所以libraryTwo.jar中的類永遠不會成功加載。不幸的是,虛擬機幾乎從不會說實際的類丟失,而是會報告事件鏈中的第一類,導致需要一個缺失的類。這幾乎總是一個bean或servlet類。

+0

沒有嘗試過,但聽起來不錯。 +1 – JoseK 2010-10-14 11:09:05

+0

不會,不會工作......我的EJB依賴於另一個.jar中的類。我tried'n'tried把那個的.jar分成幾個點,沒有運氣:在的.ear的根,進入的.war的根,進入的.war的WEB-INF/lib文件夾...當我啓動Tomcat的服務器我一直有'java.lang.NoClassDefFoundError:無法完全加載類:eu.partecis.proxya.ejb.autorisation.UcAutorisationBean 由於:EvtAutorisationRechercheBean in classLoader:(yadayada)'exception。 – Julian 2010-10-14 15:06:16

+0

將第三方庫放在耳朵或戰爭的根部是無效的。如果您的ejb jar在同一個WEB-INF/lib目錄下,那麼WEB-INF/lib應該可以工作。將擴大答案以顯示一些假設的例子。如果你可以擴大這個問題來展示你正在使用的所有罐子,那就太好了。 – 2010-10-14 21:24:25

0

謝謝大衛。 我嘗試了以上所有內容,但仍然沒有運氣。 已覆蓋EAR的做法不會爲我工作,我猜,我就我所知的Tomcat 6.0.18不符合的J2EE規範6。也許我錯了,但我試過了,反正它不起作用。所以回到標準的EAR方法。作爲你的第一個例子描述

我耳邊正好舉辦。一個Ejb jar,兩個庫文件夾放在/ lib中,就是這樣。 Tomcat仍然無法實例化我的EJB,因爲EJB類與Library Jar Two中的無法訪問的類相關。

我簡化我的application.xml文件,以便它只聲明一個單一的EJB:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE ...> 
<application> 
    <display-name>ProxyaEAR</display-name> 
    <module id="EjbModule"> 
    <ejb>ProxyaEJB.jar</ejb> 
    </module> 
</application> 

沒有其他的想法?

+0

另一篇文章中的例子沒有描述符。如果你有一個描述,那麼你必須列出所有你的罐子明確地 myLibrary.jar每個第三方庫。 – 2010-10-16 18:41:52

相關問題