4

我正在重新考虑我一直认为理所当然的事情。即,在具有以下结构的 EAR 中:

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

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

4

3 回答 3

7

你是绝对正确的 - 它会更清晰,更不容易出现依赖不匹配的错误。

但...

如果您不在 EAR 中分发 Web 应用程序,该怎么办?你会把库放在哪里?您将如何在不同的 EAR 中分发您的 webapps,以便您可以基于一组 webapps 组合企业应用程序?

WEB-INF/lib 也适用于只能包含资源的 jars(其中没有类)。然后,您会将面向 Web 的资源 jar 放入 EAR 级别的库中吗?我不这么认为。

使用 WEB-INF/lib 而不是 EAR 的 lib 可能有更多的理由,但上述两/三种情况至少应该足以说服您重新考虑管理库的策略。

于 2013-01-18T12:21:23.673 回答
1

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

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

这是 maven 的示例战争配置,其中从 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>
于 2013-01-17T21:44:35.547 回答
0

我会说,如果您有一个可以自行运行并且可以自行部署的 Web 应用程序,那么它应该打包在一个 war 中。但是,如果不是……如果战争只是一个更大的应用程序的一个组件,并且这就是它始终交付/部署的方式,那么只需将 Web 应用程序所需的 Web 资源放入战争中,以及耳朵库中的所有代码罐。

于 2016-11-29T14:23:20.880 回答