使用 maven 构建具有不同依赖项的相同 webapp 两次的最佳方法

Best way to build twice the same webapp with different dependencies using maven

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

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

我不想在 maven 存储库上部署 webapp,因为它不是一个库,它只会生成一个大存档(主要是因为嵌入的依赖项),它会白白消耗 space .因此,要构建最终战争,我不能添加对 webapp 项目的依赖。

我不想在两个不同的模块中复制通用的 webapp class 文件和配置文件。由于每次更新一个文件时两个模块之间都需要同步,这将使未来的发展更加困难。

关于如何解决这个问题有什么建议吗?

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

使用 Maven 配置文件。

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

您可以将某些依赖项放入某些配置文件中,并通过带有 -P 参数的命令行 activate/deactivate 它们。

我想在你的 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他们的介绍文章。

最后,我没有使用配置文件。同时构建两个 webapp 版本时出现问题。

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

首先,我创建了一个瘦 war 版本的网络应用程序。瘦 war 不包括库或 META-INF 文件。只有配置文件之类的资源。 webapp 类 被打包在一个 jar 中(使用 maven-war-pluginattachedClasses 配置选项)。我不介意部署这个 war,因为它非常轻巧。这是 maven-war-plugin 的配置:

            <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>

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

<dependencies>
    <dependency>
        <groupId>com.storage</groupId>
        <artifactId>client</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>com.group.id</groupId>
        <artifactId>webapp</artifactId>
        <version>${project.version}</version>
        <classifier>classes</classifier>
        <type>jar</type>
    </dependency>
    <dependency>
        <groupId>com.group.id</groupId>
        <artifactId>webapp</artifactId>
        <version>${project.version}</version>
        <type>war</type>
    </dependency>
</dependencies>

<build>
    <plugins>                   
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-deploy-plugin</artifactId>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
    </plugins>
</build>