maven利用profile实现多环境开发

本文将简单介绍怎样利用maven的profile实现多环境情况下开发程序。一般开发程序分为“dev”开发环境;“prod”生成环境;“test”测试环境;

在开发过程中,我们的项目会存在不同的运行环境,比如开发环境(dev)、测试环境(test)、生产环境(prod),而我们的项目在不同的环境中,有的配置可能会不一样,比如数据源配置、日志文件配置、以及一些软件运行过程中的基本配置,那每次我们将软件部署到不同的环境时,都需要修改相应的配置文件,这样来回修改,很容易出错,而且浪费劳动力。

maven为我们提供了一种更加灵活的解决方案,就是 profile 功能。

profile的原理

先看一段 pom 文件中的 profile 定义。如下:

<profiles>
	<profile>
	        <!-- 开发环境 -->
		<!-- 不同环境Profile的唯一id -->
		<id>dev</id>
		<properties>
			<!-- profiles.active 是自定义的字段(名字随便起),自定义字段可以有多个 -->
			<profiles.active>dev</profiles.active>
		</properties>
	</profile>
	<profile>
	        <!-- 生成环境 -->
		<id>prod</id>
		<properties>
			<profiles.active>prod</profiles.active>
		</properties>
		<activation>
			<activeByDefault>true</activeByDefault>
		</activation>
	</profile>
	<profile>
	        <!-- 测试环境 -->
		<id>test</id>
		<properties>
			<profiles.active>test</profiles.active>
		</properties>
	</profile>
</profiles>

可以看到定义了多个 profile,每个 profile 都有唯一的 id,也包含 properties 属性。这里为每个 profile 都定义一个名为 profiles.active 的 properties,每个环境的值不同。当我们打包项目时,激活不同的环境,profiles.active 字段就会被赋予不同的值。

应用实例

在正式介绍前,我们先看看项目的结构,如下图所示:

maven利用profile实现多环境开发

介绍一下,本项目在resouces目录下面创建了三个目录,分别为 dev(开发环境)、prod(生成环境) 和 test(测试环境)。这些目录下面存放属性文件,属性文件中保存项目需要的信息,如:数据库连接信息、调用远程API等信息。上图右边是maven的结构信息,其中显示3个profile,分别为“dev”、“prod”和“test”。

pom.xml 文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="https://maven.apache.org/POM/4.0.0"
         xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.huangx.maven</groupId>
    <artifactId>learn-maven-profile</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <!-- 定义maven的版本属性 -->
    <properties>
        <spring.version>4.3.12.RELEASE</spring.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>


    <build>
        <!-- 资源打包 -->
        <resources>
            <resource>
                <directory>src/main/resources/</directory>
                <!-- 打包时先排除掉三个文件夹 -->
                <excludes>
                    <exclude>dev/*</exclude>
                    <exclude>prod/*</exclude>
                    <exclude>test/*</exclude>
                </excludes>
            </resource>
            <resource>
                <!-- 这里是关键!根据不同的环境,把对应文件夹里的配置文件打包 -->
                <directory>src/main/resources/${profiles.active}</directory>
            </resource>
        </resources>
    </build>


    <profiles>
        <!-- 开发环境 -->
        <profile>
            <!-- 不同环境Profile的唯一id -->
            <id>dev</id>
            <properties>
                <!-- profiles.active是自定义的字段,自定义字段可以有多个 -->
                <profiles.active>dev</profiles.active>
            </properties>
            <activation>
                <!-- 标记为默认 profile -->
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>

        <!-- 生成环境 -->
        <profile>
            <id>prod</id>
            <properties>
                <profiles.active>prod</profiles.active>
            </properties>
        </profile>

        <!-- 测试环境 -->
        <profile>
            <id>test</id>
            <properties>
                <profiles.active>test</profiles.active>
            </properties>
        </profile>
    </profiles>

</project>

注意上面的 <resource> 元素,必须要设置这些,可以根据自己的需要去调整。

在 IDEA 中的 maven 选项卡,勾选你要打包的 profile,然后执行 package 生命周期。如下图:

maven利用profile实现多环境开发

执行成功如下图:

maven利用profile实现多环境开发

根据上面的配置,你会发现 applicationContex.xml 文件中的 context:property-placeholder 配置飘红了,因为在项目的resources目录下面没有 applicationContext.xml 文件,该文件只存在打包好的target下面。如下图:

maven利用profile实现多环境开发

解决这个问题很简单,把我们几个属性文件中的共有属性提取处理啊,放到 resouces 下面的 application.properties 中,然后将 dev/prod/test 目录下面的 application.properties 改名为 env.properties,如下图:

maven利用profile实现多环境开发

最后,修改 applicationContex.xml 为如下:

<context:property-placeholder location="classpath:*.properties" />

参考资料:

https://blog.csdn.net/java_collect/article/details/83870215

天下之事常成于困约,而败于奢靡。——陆游
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号