使用maven构建具有不同依赖关系的两个相同webapp的最佳方法

时间:2017-09-05 08:59:18

标签: java maven war

我有一个带有webapp的maven项目,我需要两个版本,每个版本都有自己的依赖项。目的是支持存储客户端的两个不同(和冲突)版本。在两种情况下,webapp代码,配置文件以及除某些库之外的任何内容都是相同的。正确的客户端在运行时加载:我只需要将正确的jar(及其依赖项)放在webapp的lib文件夹中。

如果我手动部署依赖项,我将失去检查版本冲突的机会(当我构建一个正确设置了所有依赖项的maven项目时,我会这样做。)

我不想在maven存储库上部署webapp,因为它不是一个库,它只会产生一个大型存档(主要是因为嵌入式依赖项),它会消耗空间。因此,为了构建最终的战争,我无法在webapp项目上添加依赖。

我不想在两个不同的模块中复制常见的webapp类文件和配置文件。由于每次更新一个文件时两个模块之间必要的同步,这将使未来的演进变得更加困难。

关于如何解决这个问题的任何建议?

请注意,最佳解决方案应该允许同时构建两个战争。

3 个答案:

答案 0 :(得分:2)

使用Maven个人资料。

http://maven.apache.org/guides/introduction/introduction-to-profiles.html

您可以将某些依赖项放入某些配置文件中,并通过命令行使用-P参数激活/停用它们。

答案 1 :(得分:2)

我想在你的pom中定义两个配置文件可能会起到作用:

<project [...]>
    [...]
    <profiles>

      <profile>
        <id>storage1</id>
        <dependencies>
          <dependency>
             <groupId>my.group.storage</groupId>
             <artifactId>thisOne</artifactId>
             <version>13</version>
          </dependency>
        </dependencies>
      </profile>

      <profile>
        <id>storage2</id>
        <dependencies>
          <dependency>
             <groupId>my.group.storage</groupId>
             <artifactId>thisOtherOne</artifactId>
             <version>37</version>
          </dependency>
        </dependencies>
      </profile>

    </profiles>
    [...]
</project>

使用mvn -P storage1mvn -P storage2拨打其中一个。您也可以默认激活一个激活,使用基于其他属性的激活触发器等。

Here是他们的介绍文章。

答案 2 :(得分:1)

最后,我没有使用个人资料。有一个问题同时构建了两个webapp版本。

相反,我使用了战争叠加https://maven.apache.org/plugins/maven-war-plugin/overlays.html

首先,我创建了一个瘦弱的webapp战争版本。瘦小的战争不包括库或META-INF文件。仅限配置文件等资源。 webapp类打包在jar中(使用attachedClasses的{​​{1}}配置选项)。我不介意部署这场战争,因为它非常轻盈。以下是maven-war-plugin

的配置
maven-war-plugin

然后,我创建了2个额外的模块,每个模块用于webapp的每种风格。在依赖项中,我设置:   - webapp作为类型战的依赖   - webapp类的jar   - 存储客户端库 这样,maven会检查所有库中的依赖冲突。 webapp类是通过依赖项导入的。叠加战争用于建立最后的战争。 webapp的两种风格之间没有重复的代码。只有客户端依赖关系在2个pom文件之间发生变化。以下是其中一个的摘录:

            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <outputFileNameMapping>@{groupId}@.@{artifactId}@-@{version}@@{dashClassifier?}@.@{extension}@</outputFileNameMapping>
                <attachClasses>true</attachClasses>
                <archive>
                    <addMavenDescriptor>false</addMavenDescriptor>
                </archive>
                <packagingExcludes>WEB-INF/classes/**/*,WEB-INF/lib/*</packagingExcludes>
            </configuration>
        </plugin>