Maven SkinnyWars不会从WEB中删除ejb jar

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

正如我发现被移动的依赖关系必须在EAR模块中声明,并且必须包含在META-INFlib目录中。 这不适用于位于EAR模块的根目录中的EJB模块。

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

现在的结构是这样的:

-EAR
 -ejb.jar
  -META-INFlib
   -shared libraries
 -web.war
  -WEB-INFlib
   -ejb.jar
   -other non-shared libraries

我已经回答了一个类似的问题:如何让Maven将所有常见的战争机器放置在同一个EAR到EAR根之间的战争中?

不幸的是,这似乎不适用于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文件夹中的所有内容,但是如果您不得不另外将WAR部署在没有周围EAR的单独机器上,它也可能有其缺点。


这里的问题在于,从将用于将其部署到服务器的耳模块中引用EJB,而不是从需要EJB类与服务器接口的客户端引用该EJB。

如果将依赖关系包含在耳朵模块中,它会认为您正在声明要部署的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清单。

但是如果客户端和主要工件是相同的,那么它会重复吗?

简短的答案是肯定的。 长的答案是肯定的。 它会得到重复,但只有一次,而不是每次使用它的WAR中。 我不认为有一个干净的方法来避免这种情况,我不确定它在概念上是否合理。 当然,您可以使用packagingExcludes和自定义清单,但将JAR重复两次是有意义的。

如果您的客户端JAR实际上比较薄(例如,仅有接口),那么客户端JAR实际上不允许它们访问EJB实现,这总是一个好主意。

您可以将相同的JAR视为前一个的特例,并且让它们保持分离是有概念意义的。

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

链接地址: http://www.djcxy.com/p/14497.html

上一篇: maven skinnyWars does not remove ejb jars from WEB

下一篇: How to write declarative Cucumber features for describing CRUD operations?