实际开发项目是需要配置多套环境配置的,如开发、测试、生产等。 在Maven中,有种多环境配置的方法,可以做到在开发、测试、运营的时候,使用各自对应的环境配置,可以大大的提高开发效率。
下面看下环境的配置文件:
用个例子说明下。为了对比方便,这里创建了一个聚合项目,然后其中一个Project根据构建参数不同,加载不同配置。另一个Project不加载配置。目录如下:
这里有三个project,各自的pom如下:
mavenaggregator的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com</groupId> <artifactId>mavenaggregator</artifactId> <!-- require pom if aggregator --> <packaging>pom</packaging> <version>1.0.0.1</version> <name>my Maven Webapp</name> <url>http://maven.apache.org</url> <modules> <!-- relative paths to the directories of pom --> <module>my-project</module> <module>another-project</module> </modules> </project>my-project的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com</groupId> <artifactId>my-project</artifactId> <packaging>jar</packaging> <version>1.0.0.1</version> <name>my-project</name> <url>http://maven.apache.org</url> <parent> <groupId>com</groupId> <artifactId>mavenaggregator</artifactId> <version>1.0.0.1</version> </parent> </project>another-project的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com</groupId> <artifactId>another-project</artifactId> <packaging>jar</packaging> <version>1.0.0.1</version> <name>another-project</name> <url>http://maven.apache.org</url> <parent> <groupId>com</groupId> <artifactId>mavenaggregator</artifactId> <version>1.0.0.1</version> </parent> </project>
mavenaggregator的pom.xml中添加如下:
<!-- 其他代码 --> <profiles> <profile> <!-- 本地开发打包 --> <id>development</id> <properties> <!-- 为该环境下的build指定参数赋值 --> <env>development</env> <deploy.url>http://host:port/manager/text</deploy.url> </properties> <activation> <!-- 默认激活的(activeByDefault为true) --> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>production</id> <properties> <!-- 为该环境下的build指定参数赋值 --> <env>production</env> <deploy.url>http://host:port/manager/text</deploy.url> </properties> <activation> <!-- 默认激活的(activeByDefault为true) --> <activeByDefault>true</activeByDefault> </activation> </profile> </profiles> <!-- 其他代码 -->通常为了开发方便,我们都是将本地开发激活 <activeByDefault>true</activeByDefault>,即当构建时没有参数时,默认使用本地开发配置。
下面看下环境的配置文件:
带有参数的 common的文件,这里是 config.properties
username=${db_username} password=${db_password}而各个环境的参数配置,都在各自文件夹下,比如这里的 resource/development/build.properties 和 resource/production/build.properties 。
db_username=local db_password=password1
db_username=production db_password=password1因为我们这里只需要让这个子Project加载资源文件,因此只需要在my-project的pom.xml中添加如下配置:
<!-- 其他代码 --> <build> <plugins> <plugin> <!-- 处理资源文件。默认的主资源文件目录是src/main/resources,可以在此指定额外的资源文件目录 --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.5</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> <resources> <resource> <!-- 资源文件位置src/main/resources/,这下面的资源文件的${}会全部被替换成filter中的标签内容。 directory指定的value会作为classes的资源跟目录, 比如指定:src/main/resources/,则classes下会出现jdbc等包, 若指定:src/main/resources/jdbc/,则classes下直接出现jdbc包下的文件,不会额外出现jdbc等其他包结构。因为他把jdbc作为了根目录 --> <directory>src/main/resources</directory> <!-- 在某个resource中如果设置filtering为true,将会根据输入参数动态修改相关内容。 --> <filtering>true</filtering> <!-- 排除环境的配置资源根目录使用单独的资源目录来指定 --> <excludes> <exclude>production/*</exclude> <exclude>development/*</exclude> </excludes> </resource> <!-- <resource> --> <!-- 然后再加载使用单独的资源目录来指定 --> <!-- <directory>src/main/resources/${env}</directory> --> <!-- </resource> --> </resources> <filters> <filter>src/main/resources/${env}/build.properties</filter> </filters> </build> <!-- 其他代码 -->最后,回到项目根目录下,执行maven命令即可:
mvn clean package -Pproduction或
mvn clean package -Pdevelopment此时再回到my-project的target 目录就会发现 config.properties 文件里面的参数都已经被指定环境的配置替换好了。
username=local password=password1