使用 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 storage1
或 mvn -P storage2
调用一个或另一个。您还可以让一个默认激活,使用基于其他属性的激活触发器等。
Here他们的介绍文章。
最后,我没有使用配置文件。同时构建两个 webapp 版本时出现问题。
相反,我使用了 war 叠加层 https://maven.apache.org/plugins/maven-war-plugin/overlays.html。
首先,我创建了一个瘦 war 版本的网络应用程序。瘦 war 不包括库或 META-INF 文件。只有配置文件之类的资源。 webapp 类 被打包在一个 jar 中(使用 maven-war-plugin
的 attachedClasses
配置选项)。我不介意部署这个 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>
我有一个带有 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 storage1
或 mvn -P storage2
调用一个或另一个。您还可以让一个默认激活,使用基于其他属性的激活触发器等。
Here他们的介绍文章。
最后,我没有使用配置文件。同时构建两个 webapp 版本时出现问题。
相反,我使用了 war 叠加层 https://maven.apache.org/plugins/maven-war-plugin/overlays.html。
首先,我创建了一个瘦 war 版本的网络应用程序。瘦 war 不包括库或 META-INF 文件。只有配置文件之类的资源。 webapp 类 被打包在一个 jar 中(使用 maven-war-plugin
的 attachedClasses
配置选项)。我不介意部署这个 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>