我有一个多模块 Maven2 项目,它构建了一个 Web 应用程序。该应用程序连接到后端服务器和数据库。我们的环境中部署了多个服务器实例,还有多个用于开发、UAT、生产等的后端和数据库实例。因此,实际上,每个应用程序配置都需要这 3 个坐标:
我正在致力于应用程序配置的统一和自动化。在 Maven 中将这些不同的配置表示为配置文件是简单而明显的。然后我可以通过激活每个组中的一个配置文件来创建特定配置,例如
mvn -Pserver.Server1,backend.prod,db.uat clean install
输入起来有点乏味并且容易出错 - 如果特定服务器配置错误以连接到错误的数据库,则代价可能会很高。解决此问题的一种明显方法是将所有有用的配置文件组合放入脚本文件中。
但我认为我可以通过直接从服务器配置文件激活必要的后端和数据库配置文件来更聪明。服务器配置文件位于主 pom 中,例如
<profile>
<id>server.myserver</id>
<properties>
<jboss.home>D:\Programs\jboss-4.2.1.GA</jboss.home>
<server.name>NightlyBuild</server.name>
<hosttobind>192.168.1.100</hosttobind>
<servlet.port>8080</servlet.port>
...
<db>dev02</db>
</properties>
</profile>
后端和数据库配置文件位于 Config 子模块的 pom 中,例如
<profile>
<id>db.dev02</id>
<activation>
<property>
<name>db</name>
<value>dev02</value>
</property>
</activation>
<properties>
<jdbc.address>jdbc:oracle:thin:@192.168.0.101:1521:dbdev02</jdbc.address>
</properties>
</profile>
因此理论上,由于
server.myserver
配置文件将 db
属性设置为 dev02
,这应该会触发子 pom 中 db.dev02
配置文件的激活。然而,这并没有发生。 (顺便说一句,如果两个配置文件位于同一个 pom 中,也不会)。如果我使用 从命令行设置属性
mvn -Ddb=dev02 help:active-profiles
然后配置文件被激活,所以显然我没有拼写任何错误。
我是不是忽略了什么?还有其他方法可以完成这项工作吗?
我看到存在类似的问题:我可以让一个maven配置文件激活另一个吗?
然而,恕我直言,这不是重复的 - 我发现我的方法不起作用,我想了解原因。 (我已阅读参考资料,但我可能忽略了一些明显的东西)。
该功能根本不存在。属性激活器使用传入的属性,而不是配置文件设置的任何内容(否则它不知道在没有更复杂的逻辑的情况下以什么顺序激活它们)。
您使用的解决方案具有相同的属性来激活您想要一起做的事情,这是最好的解决方案。我意识到这可能并不总是令人满意 - 在这种情况下,您所能做的就是退回到使各个配置文件尽可能简单,以便您可以在命令行上以您想要的方式组合它们,而无需在它们之间重复内容。
涵盖此功能的问题是:https://issues.apache.org/jira/browse/MNG-3309
涉及属性激活的问题是:https://issues.apache.org/jira/browse/MNG-2276
已在 maven 3.x 中解决,因此您现在可以在 settings.xml 中定义属性以触发 pom 中的配置文件。 这是一个例子: 在settings.xml中:
<profile>
<id>localDist</id>
<activation>
<property><name>localDist</name></property>
</activation>
<properties>
<doReleaseTasks>true</doReleaseTasks>
</properties>
</profile>
在你的 pom 中(或者更好的是,在你的父 pom 中):
<profile>
<id>doReleaseTasks</id>
<activation>
<property><name>doReleaseTasks</name></property>
</activation>
<build>
<plugins>
... mvn -DlocalDist will activate these plugins
</plugins>
</build>
</profile>
使用 Enforcer 插件强制使用 mvn 3.0 或更高版本是个好主意:
<build>
<plugins>
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<id>enforce-maven</id>
<goals> <goal>enforce</goal> </goals>
<configuration>
<rules>
<requireMavenVersion>
<version>[3.0,)</version>
<message>
*** Maven 3.x required to allow cascading profiles to be activated in settings.xml (MNG-2276)
</message>
</requireMavenVersion>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
qulice
的配置文件,它使用了一个已过时的依赖项,并且无法与最新的 Java 版本一起使用。我需要根据安装的JDK选择依赖版本。实现此目的的唯一方法是使用
多个 Maven 配置文件。但是,我想维护单一配置文件以避免 CI/CD 出现问题。 换句话说,我需要添加
quliceJava8
和 quliceJava11
配置文件,同时保留 qulice
配置文件,这将根据 JDK 版本触发 quliceJava8
或 quliceJava11
配置文件。
我通过使用以下配置找到了解决方法:<profiles>
<profile>
<id>qulice</id>
<build>
<plugins>
<plugin>
<groupId>com.qulice</groupId>
<artifactId>qulice-maven-plugin</artifactId>
<version>${qulice.version}</version>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>quliceJava11</id>
<activation>
<jdk>[11,)</jdk>
</activation>
<properties>
<qulice.version>0.22.0</qulice.version>
</properties>
</profile>
<profile>
<id>quliceJava8</id>
<activation>
<jdk>1.8</jdk>
</activation>
<properties>
<qulice.version>0.21.0</qulice.version>
</properties>
</profile>
</profiles>
虽然您在这里不以级联方式激活配置文件,但您可以通过这种方式配置它们。现在我可以打电话了:
mvn install -Pqulice
一切正常。