Maven 2 如何让maven将战争中常见的所有罐子放在同一个耳朵对耳朵的根中?

Maven 2 如何让maven将战争中常见的所有罐子放在同一个耳朵对耳朵的根中?,maven-2,dependencies,package,war,ear,Maven 2,Dependencies,Package,War,Ear,我们有很多战争的解决方案。战争在使用hibernate和spring的意义上是相似的。这意味着我们在每场战争中都有许多相同的罐子。这正成为一个问题,因为耳朵的大小开始变得不成比例 我想使用Maven来计算依赖关系,并将多场战争中常见的所有JAR放在EAR的根目录下 我尝试使用j2ee原型(maven-archetype-j2ee-simple)组织我的项目,但所有WAR仍然在WEB-INF/lib中打包了依赖项。 有没有一种方法可以让Maven计算公共依赖项并将它们放到EAR中,就像他在构建wa

我们有很多战争的解决方案。战争在使用hibernate和spring的意义上是相似的。这意味着我们在每场战争中都有许多相同的罐子。这正成为一个问题,因为耳朵的大小开始变得不成比例

我想使用Maven来计算依赖关系,并将多场战争中常见的所有JAR放在EAR的根目录下

我尝试使用j2ee原型(maven-archetype-j2ee-simple)组织我的项目,但所有WAR仍然在WEB-INF/lib中打包了依赖项。 有没有一种方法可以让Maven计算公共依赖项并将它们放到EAR中,就像他在构建war或jar时能够计算所有过渡依赖项一样?

您可以将设置为“提供”。这意味着它们将由其他模块提供,不会包含在最终的jar或war中


也许在包装最终的EAR时,可以帮助您将普通的罐子放在那里。

创建一个名为commons jars的新工件,并将其包装为pom。它应该取决于您正在使用的所有常用JAR—Spring、Hibernate、Log4j等


然后,在每个WAR中,将其添加为范围为“provided”的依赖项(不要忘记将类型设置为pom)。您可以在类路径中看到它,但它们不会打包到war中。通过这种方式,您还可以将特定于战争的依赖项打包到其中,而其中的解决方案不提供这些依赖项。

正如您在评论中提到的,计算每个依赖项是maven的任务。当您创建一个工件时,使用每个常见的依赖项,那么您还必须猜测哪些依赖项属于那里

也有可能,您必须部署一个war,它的依赖关系在另一台没有ear的机器上,当您将每个war依赖关系设置为“提供”时,您再次陷入困境

获得骨感战争的唯一正确方法是通过以下示例:

但是,现在有趣的部分来了,有一个大的!捷径(完全消除了提到的痛苦),告诉maven,你的战争有哪些依赖

进入EAR模块,为每个WAR依赖项声明第二个WAR依赖项,类型为pom

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>com.foo</groupId>
    <artifactId>skinny</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>ear</artifactId>
<packaging>ear</packaging>
<dependencies>
    <dependency>
        <groupId>com.foo</groupId>
        <artifactId>war</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>war</type>
    </dependency>
    <dependency>
        <groupId>com.foo</groupId>
        <artifactId>war</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>pom</type>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-ear-plugin</artifactId>
            <version>2.8</version>
            <configuration>
                <skinnyWars>true</skinnyWars>
                <defaultLibBundleDir>lib</defaultLibBundleDir>
                <modules>
                    <webModule>
                        <groupId>com.foo</groupId>
                        <artifactId>war</artifactId>
                    </webModule>
                </modules>
            </configuration>
        </plugin>
    </plugins>
</build>

4.0.0
com.foo
极瘦的
0.0.1-快照
耳朵
耳朵
com.foo
战争
0.0.1-快照
战争
com.foo
战争
0.0.1-快照
聚甲醛
org.apache.maven.plugins
maven耳朵插件
2.8
真的
解放党
com.foo
战争

现在,每一场战争都将独立地打包,并带有它自己的依赖项,EAR将打包为瘦战争和lib文件夹中的每一个依赖项

更新:

请记住,ear/lib文件夹不能用于像JBoss EAP 6这样严格容器中的每个依赖项jar。像tomahawk、primefaces等JSF组件库必须驻留在WEB-INF/lib文件夹中

使用上述解决方案实现此目的的一个简便方法是在EARs pom.xml中排除组件库,如下所示:

...
<dependencies>
    <dependency>
        <groupId>com.foo</groupId>
        <artifactId>war</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>war</type>
    </dependency>
    <dependency>
        <groupId>com.foo</groupId>
        <artifactId>war</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>pom</type>
        <exclusions>
            <exclusion>
                <groupId>org.primefaces</groupId>
                <artifactId>primefaces</artifactId>
            <exclusion>
        </exclusions>
    </dependency>
</dependencies>
...
。。。
com.foo
战争
0.0.1-快照
战争
com.foo
战争
0.0.1-快照
聚甲醛
org.primefaces
素面
...

现在,WAR的每个依赖项都将放在ear/lib中,除了组件库,它将放在WAR中的WEB-INF/lib中“现在是痛苦的部分。您的EAR项目的pom.xml需要列出WAR的每个依赖项。这是因为Maven假设了胖战争,并且不包括EAR中战争的可传递依赖项。“我问:我想用Maven来计算依赖项。。。如果不使用Maven计算依赖项,这是一个不可能的…@Dan,阅读Turbokiwi的答案,了解如何以极好的方式避免痛苦的部分:)因此,在我们创建commons-jars.jar之后,我们应该将其添加到1)server/default/lib还是2)ear root?这不是最好的方法,请参阅下一个答案@请定义“下一个”答案。答案由谁或一个链接将是有帮助的,因为他们可能会根据选票交换位置。这真的需要更多的选票!!太棒了德妮丝!:)这真的帮助了我!此解决方案是否也适用于更深层次的依赖关系?或者我需要在WAR中明确声明工件,以便在EAR中排除它们吗?这是一个非常巧妙的技巧,它使得在捆绑在EAR中的企业应用程序中管理依赖关系更加容易。它将所有可传递的依赖项绑定到/lib目录中,同时只在根目录绑定精简的WAR文件。荣誉这确实有效,应该是最好的答案。它创造了一些很好的隔离。WAR的pom.xml不必被触及,并且与EAR项目保持解耦。