[Maven]Maven中使用profile和filtering进行属性替换

原文链接

http://www.360doc.com/content/15/0123/10/20466010_443036304.shtml

背景

构建项目时可能会遇到在测试(如单元测试)、开发、模拟、生产等不同环境下需要不同配制(properties、xml)或资源(jpg、png、mp3)的情况。比如常见的数据库连接(即jdbc url)的值,在不同的环境下可能有如下几种值:

  • 测试环境:jdbc:mysql://localhost:3306/foobar_test
  • 开发环境:jdbc:mysql://localhost:3306/foobar_dev
  • 模拟环境:jdbc:mysql://192.168.1.11:3306/foobar
  • 生产环境:jdbc:mysql://192.168.1.10:3306/foobar

或者同样是生产环境,针对(产品)交付给A公司客户的与交付给B公司客户的需要不同配置或资源,比如产品界面中的公司名称、公司LOGO等。

又或者针对不同的操作系统(如Windows,Linux)需要为某个配制设定不同的文件路径。

可见,在不同的软件开发生命周期阶段、不同的最终客户(用户环境)、不同的运行平台都有可能需要不同配置或资源的情况。假如各个环境下的差别很小的话,我们可以在项目编译之后手工修改或者写个shell script自动修改,但如果需要修改的项目很多而且复杂的话,则应该使用Maven的Profile和Filtering功能来解决。(当然前题是你的项目必须是用Maven构建的啦,哈哈,还有测试阶段所使用到的资源文件实际上Maven默认已经划分出来,所以并不需要本文所说的方法)

Filtering功能

FilteringMaven Resources Plugin的一个功能,它会使用系统属性或者项目属性的值替换资源文件(*.properties, *.xml)当中${…}符号的值。比如你系统属性有一荐”user.name=foobar”,那么资源文件当中的${user.name}符号会在Maven编译时会自动被替换为”foobar”。

举个例子:
默认的项目资源文件位于”src/main/resources”目录,在该目录下创建一个文件”test.properties”,里面写上一行:

Hello ${user.name}

然后修改项目文件(pom.xml)启动filtering功能,如:

<project>
    ...
    <build>
        ...
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
            ...
        </resources>
        ...
    </build>
    ...
</project>

然后编译项目:

$ mvn clean compile -Duser.name=foobar

查看输出文件target/classess/test.properties的内容,可见原先的”Hello {user.name}”已经变成”Hello foobar”

我们也可以把filtering用到的变量写在项目属性段里,比如:

<project>
    ...
    <properties>
        <user.name>foobar</user.name>
        <user.email>[email protected]</user.email>
    </properties>
    ...
</project>

如果属性项比较多的话,最佳实践是把他们抽离出来独立一个属性文件,比如在你项目目录(即pom.xml文件所在的目录)新建一个属性文件project.properties

user.name=foobar
user.email=foobar@some.cn

然后在build/filters/filter里指明使用这个属性文件作为filtering属性值的来源

<project>
...
    <build>
    ...
        <filters>
            <filter>project.properties</filter>
        </filters>
    ...
    </build>
...
</project>

Profile功能

Profile的作用是允许你在项目文件(pom.xml)里定义若干个profile段,然后在编译时选择其中的一个用于覆盖项目文件原先的定义。接着上一个例子,如果我们需要为开发环境和生产环境定义不同的user.name属性值,则我们在项目目录里创建两个属性文件:
profile-development.properties,内容

user.name=foobar

profile-production.properties,内容


user.name=tom

然后在项目文件(pom.xml)里增加profile段,如下:

<project>
...
    <profiles>
        <profile>
            <id>development</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <filters>
                    <filter>profile-development.properties</filter>
                </filters>
            </build>
        </profile>
        <profile>
            <id>production</id>
            <build>
                <filters>
                    <filter>profile-production.properties</filter>
                </filters>
            </build>
        </profile>
    </profiles>
...
</project>

在编译项目时,可以使用-P参数指定需要使用的profile的id,比如下面命令将会使用development profile:

$mvn clean compile -Pdevelopment

如果想使用production profile则执行如下命令:

$mvn clean compile -Pproduction

假如不指定-P参数的话,则会使用activeByDefault=true的一项(即development)。

至此,通过filtering和profile功能实现了为开发环境和生产环境使用不同配置值的目的。当然profile还可以允许你添加更多的定义,比如为某一个profile添加不同的资源文件。在一些大中型项目里,不同的环境可能仅仅修改配置值并不足够,可能还需要某个配置文件整个替换,那么就应该在profiles/profile/build/resources段里指定了。详细的可以参阅附录链接。

猜你喜欢

转载自blog.csdn.net/weixin_36210698/article/details/82703658
今日推荐