我有一个带有webapp的maven项目,我需要两个版本,每个版本都有自己的依赖项。目的是支持存储客户端的两个不同(和冲突)版本。在两种情况下,webapp代码,配置文件以及除某些库之外的任何内容都是相同的。正确的客户端在运行时加载:我只需要将正确的jar(及其依赖项)放在webapp的lib文件夹中。
如果我手动部署依赖项,我将失去检查版本冲突的机会(当我构建一个正确设置了所有依赖项的maven项目时,我会这样做。)
我不想在maven存储库上部署webapp,因为它不是一个库,它只会产生一个大型存档(主要是因为嵌入式依赖项),它会消耗空间。因此,为了构建最终的战争,我无法在webapp项目上添加依赖。
我不想在两个不同的模块中复制常见的webapp类文件和配置文件。由于每次更新一个文件时两个模块之间必要的同步,这将使未来的演进变得更加困难。
关于如何解决这个问题的任何建议?
请注意,最佳解决方案应该允许同时构建两个战争。
答案 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 storage1
或mvn -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>