2013-01-17 23 views
3

我對我一直認爲理所當然的事情有了第二個想法。也就是說,在具有以下結構的EAR:在EAR的lib上使用WEB-INF/lib的理由是什麼?

EAR 
\-- boo-ejb.jar 
\-- foo-web.war 
| \--WEB-INF 
|   \--lib 
\--lib 

..我想我理解正確的是WEB-INF/lib目錄是隻能由Web應用程序和EAR級需要罐子lib for 罐子所需的ejb.jar以及。理由是以某種方式使依賴關係更清晰。但是,爲什麼不將所有東西都轉儲到EAR級別文件夾lib?如果有某種衝突,我們希望深入瞭解並進行調查。這不是一個更清潔的解決方案,不太容易掩蓋潛在的兼容性/依賴性不匹配問題嗎?

回答

6

你是絕對正確的 - 這將是更清晰,不易出錯容易產生依賴性不匹配。

但是......

什麼地方,你不是一個EAR內分發Web應用程序的情況下?你會在哪裏放置庫?你會如何將你的webapps分佈到不同的EAR中,這樣你就可以根據一組webapps來編寫企業應用程序?

WEB-INF/lib也適用於只能包含資源(內部沒有類)的jar。你會把面向Web的資源罐放在EAR-level庫中嗎?我不這麼認爲。

在EAR的lib中使用WEB-INF/lib可能還有更多的原因,但上面的兩個/三種情況應該足以說服你重新考慮管理庫的策略。

1

在EAR文件中,EAR級別的lib文件夾跨所有Web應用程序(即EAR中的所有.wars)。 .war中的lib適用於僅適用於網絡應用程序大戰的庫。

很多時候,您必須將特定庫升級到EAR級別並設置classpath loader優先級優先級設置(在提供的應用程序服務器和提供的EAR之間)jar。這是服務器(如WebSphere)中的常見需求。

下面是行家爲例戰爭配置,其中具體的罐子從EAR水平檢索,並專門從WAR排除:

<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-war-plugin</artifactId> 
<configuration> 
    <archive> 
    <manifestEntries> 
     <Class-Path>lib/wsdl4j-1.6.2.jar lib/mail-1.4.jar</Class-Path> 
    </manifestEntries> 
    </archive> 
    <packagingExcludes>WEB-INF/lib/wsdl4j-1.6.2.jar,WEB-INF/lib/mail-1.4.jar</packagingExcludes> 
    <warSourceDirectory>${basedir}/src/main/webapp</warSourceDirectory> 
    <warSourceExcludes>WEB-INF/jetty-env.xml</warSourceExcludes> 
    </configuration> 
</plugin> 
0

我想說如果你有一個可以獨立運行並且可以自行部署的web應用程序,它應該打包成一場戰爭。但是,如果不是......如果戰爭只是一個更大的耳朵應用程序的一個組成部分,並且這是它總是要交付/部署的方式,那麼只需將Web應用程序所需的Web資源放入戰爭中,以及耳朵底部的所有代碼罐。

相關問題