【问题标题】:maven skinnyWars does not remove ejb jars from WEB-INF\lib\maven skinnyWars 不会从 WEB-INF\lib\ 中删除 ejb jar
【发布时间】:2013-06-22 01:50:02
【问题描述】:

我在http://maven.apache.org/plugins/maven-ear-plugin/examples/skinny-wars.html 偶然发现了maven 主题skinnyWars。如前所述,我可以使用此方法将选定的依赖项从 WAR 模块移动到 EAR 模块。它们将可用于 EAR 中的所有其他 WAR 模块。

因为我发现移动的依赖项必须在 EAR 模块中声明,并且必须包含在 META-INF\lib 目录中。 不适用于 EJB 模块,它们位于 EAR 模块的根目录中。

我的问题是如何从 WAR 中删除重复的 EJB 模块并将引用指向位于 EAR 文件中的那些?

现在的结构是这样的:

\-EAR
 -ejb.jar
  -META-INF\lib
   -shared libraries
 -web.war
  -WEB-INF\lib
   -ejb.jar
   -other non-shared libraries

【问题讨论】:

  • 我觉得这个问题可以帮到你:stackoverflow.com/questions/848947/…
  • 你有没有找到一个干净的解决方案来解决这个问题?我目前遇到同样的问题,无法正确清理。
  • 我发现的最 clean 解决方案是对 WEB-INF/lib 目录中的所有 jar 文件使用 <packagingExcludes> 元素,然后使用 @987654327 包含所有必要的库@
  • 我很快就尝试过了,但我发现 Manifest.MF 没有使用根目录中的 EJB pkg 名称进行更新。你有同样的问题吗?您是否还必须指示 war 打包程序手动添加类路径条目?
  • 我找到的最干净的解决方案是在 WAR 的 POM 中声明的 EJB 依赖项上使用 provided

标签: maven ejb war ear skinny-war


【解决方案1】:

这里的问题是从ear 模块引用EJB 将用于将其部署到服务器与从需要EJB 类的客户端引用它是不同的与服务器交互

如果您在 ear 模块中包含依赖项,它将认为您正在声明要部署的 EJB 模块。它将放置在 EAR 的根目录中,并在 application.xml 中声明。

如果你包含依赖,例如,在一个war模块中,你将得到完全相同的工件,但它会被视为一个库并放在WEB-INF/lib中。

现在,当您生成瘦战争时,对 ejb 模块的显式依赖确实匹配 WAR 中的依赖,因为 Maven 不认为它们是同一件事。这导致 JAR 被保存在使用它的 WAR/s 中。

我知道的唯一解决方案是始终为 ejb 模块生成客户端工件,即使客户端工件与主工件相同。

现在,您只在 EAR 中使用 <type>ejb</type> 依赖项。对于客户,您始终使用<type>ejb-client</type>

要从 WAR/s 中删除客户端并将其定位在 EAR 的 lib 目录中,您必须显式地将依赖项添加到 ear 模块。

因此,您的 ear 模块中的 ejb 模块有两个依赖项:一个依赖于 ejb 本身,一个依赖于客户端。第一个将 EJB 放在 EAR 的根目录中并在 application.xml 中声明它。第二个会将客户端放在 EAR 的 lib 目录中,并根据需要更新 WAR/s manifest/s。

但是如果客户端和主要工件是相同的,你会得到重复吗?

简短的回答是肯定的。长答案是肯定的。它确实会被复制,但只有一次,而不是在每个使用它的 WAR 中。我认为没有一种干净的方法可以避免这种情况,我不确定它在概念上是否有意义。当然,您可以使用 PackagingExcludes 和自定义清单,但是拥有两次 JAR 是有意义的。

如果您的客户端 JAR 真的很薄(例如,只有接口),让 WAR/s 引用客户端 JAR 实际上不允许他们访问 EJB 实现,这始终是一个好主意。

您可以将相同的 JAR 视为前一个 JAR 的特例,将它们分开在概念上是有意义的。

因此,我的建议是始终为 ejb 生成客户端工件并按照说明进行操作。总有一些东西可以排除在外,至少是任何不需要的非类文件,例如 package.html 或 ejb-jar.xml。

【讨论】:

    【解决方案2】:

    我已经回答了一个类似的问题:How to make maven place all jars common to wars inside the same EAR to EAR root?

    不幸的是,这似乎不适用于 ejb 模块。正如您已经提到的,它们会被重复。

    您可以另外使用的一件事是 maven-war-plugin 的配置:

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes>
                    </configuration>
                </plugin>
    

    这将彻底清除 WAR 的 lib 文件夹中的所有内容,但在您必须在没有周围 EAR 的单独机器上另外部署 WAR 的情况下,它也有其缺点。

    【讨论】:

    • 谢谢,我最终不得不这样做
    • 2016年了,还没有解决办法??我使用了在我的战争 pom 文件中将我的 ejb.jars 声明为“提供”的策略......但是,使用这种策略我失去了自行部署 WAR 的能力......
    猜你喜欢
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多