在EAR的lib上使用WEB-INF / lib的原因是什么?

时间:2013-01-17 17:39:33

标签: java-ee war ear

我对我一直认为理所当然的事情有了第二个想法。即,在具有以下结构的EAR中:

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

..我认为我理解正确 WEB-INF / lib 仅适用于 jars ,仅适用于Web应用程序和EAR级 lib < / strong> ejb.jar 所需的 jars 。理由是以某种方式使依赖关系更清晰。但是,为什么不将所有内容转储到EAR级 lib 文件夹中?当然,如果存在某种冲突,我们希望深入了解和调查。这不是一个更清洁的解决方案,更不容易掩盖潜在的兼容性/依赖性不匹配问题吗?

2 个答案:

答案 0 :(得分:1)

在EAR文件中,EAR级别的lib文件夹跨越所有Web应用程序(即EAR中的所有.wars)。 .war中的lib适用于仅适用于web-app war的库。

很多时候,您必须将特定库提升到EAR级别并设置classpath加载器首选项优先级设置(在提供的app-server和提供的EAR之间)jar。这是WebSphere等服务器的常见需求。

以下是maven的示例war配置,其中从EAR级别检索特定jar并且特别从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>

答案 1 :(得分:0)

我想说如果你有一个可以独立运行的Web应用程序,并且可以单独部署,那么它应该打包在战争中。但是,如果不是......如果战争只是一个更大的耳朵应用程序的一个组成部分,那就是它总是要交付/部署的方式,那么只需将Web应用程序所需的Web资源放入战争中,并且所有代码都在耳朵的lib中。