在开发过程中,我们的软件会面对不同的执行环境。比方开发环境、測试环境、生产环境,而我们的软件在不同的环境中。有的配置可能会不一样。比方数据源配置、日志文件配置、以及一些软件执行过程中的基本配置,那每次我们将软件部署到不同的环境时,都须要改动对应的配置文件。这样来回改动,是个很麻烦的事情。有没有一种方法可以让我们不用改动配置就能公布到不同的环境中呢?当然有。这就是接下来要做的事。
当然,这里的前提是使用maven做为构建工具。
使用maven来实现多环境的构建可移植性。须要借助maven提供的profile功能。通过不同的环境激活不同的profile来达到构建的可移植性。
一、配置profile
首先是profile配置。在pom.xml中加入例如以下profile的配置:
<profiles>
<profile>
<!-- 本地开发环境 -->
<id>development</id>
<properties>
<profiles.active>development</profiles.active>
<deploy.url>http://host:port/manager/text</deploy.url>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<!-- 測试环境 -->
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
<deploy.url>http://host:port/manager/text</deploy.url>
</properties>
</profile>
<profile>
<!-- 生产环境 -->
<id>production</id>
<properties>
<profiles.active>production</profiles.active>
<deploy.url>http://host:port/manager/text</deploy.url>
</properties>
</profile>
</profiles>
这里定义了三个环境,各自是development(开发环境)、test(測试环境)、production(生产环境),当中开发环境是默认激活的(activeByDefault为true),这样假设在不指定profile时默认是开发环境。
同一时候每一个profile还定义了两个属性。当中profiles.active表示被激活的profile的名称,deploy.url表示公布服务器的地址。我们须要在以下使用到这两个属性。
另外host和port各自是公布服务器的主机地址和端口号。
?
二、配置文件
针对不同的环境,我们定义不同的配置文件。而这些配置文件都做为资源文件放到mavenproject的resources文件夹下。即src/main/resources文件夹下。且各个环境的配置分别放到对应的文件夹下,而全部环境都公用的配置。直接放到src/main/resources文件夹下就可以。例如以下图所看到的:
如图所看到的,开发环境、測试环境、生产环境的配置文件分别放到src/main/resources文件夹下的development、test、production三个子文件夹中,而全部环境都公用的配置文件spring-applicationContext.xml直接放到src/main/resources文件夹下。当中jdbc.properties配置数据源、logback.xml配置日志。
?
三、maven资源插件配置
在pom中的build节点下。配置资源文件的位置。例如以下所看到的:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<!-- 资源根文件夹排除各环境的配置。使用单独的资源文件夹来指定 -->
<excludes>
<exclude>test/*</exclude>
<exclude>production/*</exclude>
<exclude>development/*</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources/${profiles.active}</directory>
</resource>
</resources>
</build>
首先第一个资源文件位置src/main/resources须要排队提各个环境的配置文件,各个环境的配置我们在第二个<resource>节点中通过前面在profile中配置的profiles.active属性来指定。即src/main/resources/${profiles.active}。
这样在激活指定的profile时。会载入指定文件夹下的配置文件。如当前激活的是production profile,那么这个资源文件夹就是src/main/resources/production。这样就达到了不同环境载入不同配置的目的。
?
四、配置tomcat-maven-plugin插件
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.2-SNAPSHOT</version>
<configuration>
<url>${deploy.url}</url>
<server>tomcat</server>
<path>/appcontext</path>
</configuration>
</plugin>
当中公布的<url>节点就是在前面profile中配置的deploy.url属性,这样不同的环境就指定了不同的公布地址。<server>和<path>节点各自是公布服务器的用户配置的id以及应用的context名称。
?
五、构建或公布
全部须要的配置就完毕了,以下是见证奇迹的时候了。通过在执行maven命令时指定不同的profile就可以构建不同环境须要的war包或公布到不同的环境了 。如:
mvn clean package -Pproduction即构建出生产环境须要的war包
mvn tomcat:redeploy -Ptest 即公布到測试环境
?
因为默认的profile是development,所以假设我们不指定profile。那么载入就是开发环境deployment下的配置文件了。
即我们在本地开发測试时,不用关心profile的问题。
并且本地开发时在eclipse中使用tomcat插件来进行热部署时也不须要额外的配置。真正的做到了依据不同环境来自己主动切换,就可以移植的构建。
另外,在进行持续集成时,使用hudson集成maven相同是很很方便的。