2013-01-17 24 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资源放入战争中,以及耳朵底部的所有代码罐。

相关问题