在多个部署环境(生产/开发)中使用Maven

我有一个Maven的Web应用程序,默认的目录结构。 那里没问题。 默认目录结构有一些属性文件指向我的本地主机数据库。

目前我创build一个Ant脚本来创build不同的战争文件 – 一个用于生产,一个用于开发,使用这些命令:

ant deploy-dev ant deploy-prod ant deploy-sit ant deploy-uat 

所以基本上他们创build一个战争文件,然后通过插入属性文件来更新战争文件

有没有这样的maven(根据configuration创build不同的战争)?

如果是这样,我该怎么做?

我尝试过mvn war但这只是创造了一场战争

仅供参考,最佳做法是不必为不同的环境重build您的工件,因为这不会导致可重新生成的版本,而其他事情在重build时可能会发生变化。 也就是说,如上所述,使用资源过滤只在重新构build项目时才有效。

当你从开发人员的工件gradletesting或验收testing生产 – 你不想重build。

你想要做什么,实际上是你的configurationdynamic的,依赖于运行时variables。 即针对不同环境的不同的弹簧设置或属性文件,例如:

 db-dev.properties db-test.properties db-prod.properties 

然后你可以使用运行时variables和Spring的PropertyPlaceholderConfigurer在这些configuration之间切换。

你也可以使用不同的弹簧configuration文件,就像我过去所做的那样,进行更复杂的设置。

我也build议你把你的“默认”设置保留为生产 – 所以如果你部署到生产环境中,你不必担心你是否忘记设置环境variables。

我更喜欢使用mavenconfiguration文件来处理这种情况。 例如我们有目录结构:

的src / main /资源
 |
 +  - 本地
 |  |
 |  ` -  specific.properties
 +  - 开发
    |
    ` -  specific.properties

在pom.xml中定义两个configuration文件:

 <profiles> <profile> <id>local</id> <activation> <activeByDefault>true</activeByDefault> </activation> <build> <resources> <resource> <directory>src/main/resources/local</directory> </resource> </resources> </build> </profile> <profile> <id>dev</id> <build> <resources> <resource> <directory>src/main/resources/dev</directory> </resource> </resources> </build> </profile> </profiles> 

在这种情况下,我不需要每次更新新文件的pom.xml。 在IDE中简单地切换configuration文件,或从命令行使用-P标志。

UPD :如果某些属性在configuration上相同,该怎么办? 做这样的configuration:

 <profiles> <profile> <id>local</id> <activation> <activeByDefault>true</activeByDefault> </activation> <build> <resources> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>src/main/config/local</directory> </resource> </resources> </build> </profile> <profile> <id>dev</id> <build> <resources> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>src/main/config/dev</directory> </resource> </resources> </build> </profile> </profiles> 

通用部分将被存储在src/main/resources ,其他configuration将会在config目录中的相应文件夹中。

如果你想从你的过程中删除ant,我会看看使用filter的构buildconfiguration文件。

在这种情况下,将您的属性文件插入到src / main / resources树结构中。 然后用这样的filter属性参数化属性文件:

 jdbc.url=${filtered.jdbc.property} 

然后在src / main / filters里面创build基于configuration文件的过滤文件。 所以你可以有dev-filters.properties sit-filters.properties等,它们包含:

 filtered.jdbc.property=jdbc url here 

然后,您为每个区域设置构buildconfiguration文件,您在其中设置指向您build筑物特定区域的env属性。 然后,您可以将资源filter设置为每个构build使用${env}-filters.properties 。 另外,您可以设置war插件来将env属性添加到您的工件中,以便您可以在不同的分类器下实际存储4个不同的工件。

然后,您只需构build每个configuration文件的应用程序。 你必须调用每个configuration文件的构build,但它确实很好。

POM中的一些设置示例:

 <build> <filters> <filter>src/main/filters/filter-${env}-application.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.1-beta-1</version> <executions> <execution> <phase>package</phase> <goals> <goal>war</goal> </goals> <configuration> <classifier>${env}</classifier> </configuration> </execution> </executions> </plugin> </plugins> </build> <profiles> <profile> <id>LOCAL</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <env>LOCAL</env> </properties> </profile> <profile> <id>DEV</id> <properties> <env>DEV</env> </properties> </profile> <profile> <id>UAT</id> <properties> <env>UAT</env> </properties> </profile> <profile> <id>PROD</id> <properties> <env>PROD</env> </properties> </profile> </profiles> 

另外,这个博客文章是我最初find完成这个步骤的地方的道具。

我已经使用Spring的PropertyPlaceholderConfigurer处理了这个问题,并且在类path中包含属性文件,在文件系统上包含属性文件:

 <context:property-placeholder location="classpath*:META-INF/spring/*.properties,file:myapp*.properties"/> 

如果在应用程序启动时(或运行testing等)在当前目录中有一个myapp * .properties文件,它将覆盖文件烘焙到war / ear / whatever中的属性。

这篇文章在maven 2上使用构buildconfiguration文件 。 它看起来只是通过antrun插件委托给ant,所以你甚至可以重新使用现有的build.xml文件。

这很好地说明了,使用@seth提到的构buildconfiguration文件 –

http://maven.apache.org/guides/mini/guide-building-for-different-environments.html