代码之家  ›  专栏  ›  技术社区  ›  Dan

如何让马文把所有战争中常见的罐子放在同一个耳根里?

  •  22
  • Dan  · 技术社区  · 15 年前

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

    我想使用Maven计算依赖关系,并将多场战争中常见的所有jar放到耳朵的根部。

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

    4 回复  |  直到 7 年前
        1
  •  8
  •   David Rabinowitz    15 年前

    创建一个名为commons jars的新工件,并将其打包为pom。它应该取决于您使用的所有常见的jar—spring、hibernate、log4j等。

    然后,在你的每一场战争中,把它添加为对“提供的”范围的依赖(不要忘记将类型设置为pom)。你可以在课堂上看到它,但它们不会被包装成战争。这样,您还可以将特定于战争的依赖项打包到其中,解决方案来自 skinny wars 不提供。

        2
  •  61
  •   Beryllium    7 年前

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

    也有可能,您必须部署一场战争,它依赖于另一台没有耳朵的机器,当您将每个战争依赖设置为“提供”时,就会再次陷入困境。

    唯一正确的办法是,从以下例子中可以看出: http://maven.apache.org/plugins/maven-war-plugin/examples/skinny-wars.html

    但是,现在有趣的是,有一个大的!捷径(完全消除了所提到的痛苦),告诉马文,你的战争有哪些依赖性。

    进入你的EAR模块,用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>
    

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

    更新:

    请记住,EAR/lib文件夹不能用于像jboss eap 6这样的严格容器中的每个依赖jar。JSF组件库(如Tomahawk、PrimeFaces等)必须驻留在WEB-INF/LIB文件夹中。

    使用上述解决方案实现这一点的一个简便方法是排除EAR 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>
    ...
    

    现在,除组件库外,战争的每个依赖项都将被放置在EAR/lib中,组件库将被放置在战争内部的WEB-INF/lib中。

        3
  •  4
  •   Mike Pone    15 年前

    您可以设置 dependancies scope “已提供”。这意味着它们将由其他模块提供,并且不会包含在最终JAR或WAR中。

    也许 assembly plugin 可以帮助你包装最后一只耳朵,并在那里放置普通的罐子。