我有一个多模块Maven2项目,它构建一个Web应用程序.应用程序连接到后端服务器和数据库.在我们的环境中部署了多个服务器实例,并且还有多个后端和数据库实例用于开发,UAT,生产等.因此,实际上,每个应用程序配置都需要以下3个坐标:
我正致力于统一和自动化应用程序配置.将这些不同的配置表示为Maven中的配置文件是很容易和明显的.然后,我可以通过激活每个组中的一个配置文件来创建特定配置,例如
mvn -Pserver.Server1,backend.prod,db.uat clean install
Run Code Online (Sandbox Code Playgroud)
键入和容易出错有点繁琐 - 如果特定服务器配置错误连接到错误的数据库,价格可能会很高.解决此问题的一种显而易见的方法是将所有有用的配置文件组合放入脚本文件中.
但我认为通过直接从服务器配置文件激活必要的后端和数据库配置文件,我可以比这更聪明.服务器配置文件位于主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>
Run Code Online (Sandbox Code Playgroud)
并且后端和DB配置文件位于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>
Run Code Online (Sandbox Code Playgroud)
因此在理论上,由于server.myserver配置文件将db属性设置为dev02,这应该触发db.dev02子pom 中的配置文件的激活.但是,这不会发生.(如果两个轮廓在同一个pom中,也不是btw).如果我从命令行设置属性
mvn -Ddb=dev02 help:active-profiles
Run Code Online (Sandbox Code Playgroud)
然后,配置文件被激活,显然我没有拼错任何东西.
我忽略了什么吗?有没有其他方法可以使这项工作?
我看到存在类似的问题:我可以让一个maven配置文件激活另一个吗?
但是,恕我直言,这不是重复 - 我看到我的方法不起作用,我想了解原因.(我已阅读参考资料,但我可能忽略了一些明显的事情).
假设我有一个模块A:jar,其依赖项的运行时和编译集取决于JDK版本.在我的示例中,我有一个pre-jdk6-profilefor JAXB API:在JDK 1.6.0之前,我需要包含jaxb-api-nnn.jar作为编译依赖项.此个人资料被放置A.pom.
我也有模块B:war,这取决于A:jar.我希望能够在构建服务器上激活此配置文件以构建JDK 1.5.x可交付项.当我在激活给定配置文件的情况下执行Maven时,我收到消息:
mvn -Ppre-jdk6-profile -o install
[WARNING]
Profile with id: 'pre-jdk6-profile' has not been activated.
Run Code Online (Sandbox Code Playgroud)
并且jaxb-api-nnn.jar在结果中缺失B.war.但是,如果我在从父级构建时激活此配置文件pom.xml,则一切正常.这意味着配置文件不是从依赖项继承的,并且父多模块pom.xml能够正确构建所有内容,因为它似乎所有配置文件都在reactor中合并.
将配置文件转换为父pom会使事情变得更糟,因为依赖关系应用于所有其他项目(例如C:ear).对于此任务是否有很好的解决方案,即,如果任何模块A依赖于模块B,那么由配置文件激活的所有编译和运行时依赖关系是否都能正确处理?
项目简介A:jar如下:
<project ...>
<artifactId>A</artifactId>
<packaging>jar</packaging>
...
<parent>
<artifactId>P</artifactId>
...
</parent>
<profiles>
<profile>
<id>pre-jdk6-profile</id>
<activation>
<jdk>(,1.6.0)</jdk>
</activation>
<dependencies>
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
</dependency>
</dependencies>
</profile>
</profiles>
...
</project>
Run Code Online (Sandbox Code Playgroud) 我们有一个多模块构建,其中包含使用不同技术的模块,如Java和Flex.是否有可能根据当前编译的模块激活不同的配置文件?
我尝试了激活之类的
<profile>
<id>flex</id>
<activation>
<file>
<exists>${basedir}/src/main/flex</exists>
</file>
</activation>
...
</profile
Run Code Online (Sandbox Code Playgroud)
但它没有用,虽然在Maven文档中记录了$ {basedir}的使用(这是Maven中的一个错误).是否有不同的可能性基于当前模块进行不同的激活?或者Maven是否只允许激活所有模块的配置文件或根本不激活?