maven多profile一探究竟

maven属性

maven自带的一些常用属性:

  • ${project.build.sourceDirectory} 项目主代码根目;src/main/java/
  • ${project.build.testSourceDirectory}项目测试代码根目录,src/test/java/
  • ${project.outputDirectory}项目主代码编译输出目录,默认是target/classes
  • ${project.build.directory}项目构建输出根目录,默认为target/
  • ${project.groupId}项目groupId
  • ${project.artifactId} 项目artifactId
  • ${project.version} 项目的version
  • 《maven多profile一探究竟》{project.artifactId}-${project.version}

自定义属性:用户可以在pom文件的properties元素下自定义自己的属性,也可以在profile中自定义属于profile的属性。

在Pom中:

<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">
   // 此处省略其他东西

    <properties>
        <my.pro>hello</my.pro>
    </properties>
</project>

除此之外,java系统属性和环境变量属性都可以作为maven的属性。比如:

  • ${user.home} 就是指向了用户目录,可以通过mvn help:system查看java系统支持的属性。
  • ${env.JAVA_HOME}指代的就是系统环境变量中的JAVA_HOME 配置的值。

多profile配置

有时候,我们需要针对不同环境配置打包项目,比如生产环境和开发环境使用不一样的数据库配置,直接修改配置文件然后构建是手动行为,效率低下且容易出错。maven提供一种自动根据不同配置构建项目的方法–使用profile。

每个profile就是一个配置,使用maven构建的时候,指定激活某个profile就可以使用某套配置。

在properties配置文件中我们可以使用这种配置。

database.jdbc.driverClass=${db.driver}
database.jdbc.url=${db.url}
...

然后在maven的配置文件中指定profile

<profiles>
        <profile>
            <id>test</id>
            <properties>
                <db.driver>com.mysql.jdbc.Driver</db.driver>
                <db.username>root</db.username>
                <db.password>abc</db.password>
                <db.url>jdbc:mysql://localhost:3306/test?useSSL=true</db.url>
            </properties>
        </profile>
        <profile>
            <id>dev</id>
            <properties>
                <db.driver>com.mysql.jdbc.Driver</db.driver>
                <db.username>root</db.username>
                <db.password>abc</db.password>
                <db.url>jdbc:mysql://localhost:3306/dev?useSSL=true</db.url>
            </properties>
        </profile>
</profiles>

说明:

  • id 指明profile的id标识
  • properties 中定义一些该profile的属性。

这样还没算完成,默认情况下,只有pom文件中的maven属性会被替换,在资源文件.properties文件中的${db.url}不会在构建的时候被替换,我们要让maven解析资源文件替换掉那些属性,就需要使用到maven的插件:maven-resource-plugin

这个插件默认只是将资源目录下的文件拷贝到编译输出目录,但可以通过简单的配置改变他的行为,来开启资源文件过滤,并且可以指定过滤规则。

在父pom中开启资源文件filter示例:

<build>
    <finalName>profile-test</finalName>
    <!--开启主目录下资源文件过滤-->
    <resources>
      <resource>
        <filtering>true</filtering>
        <directory>${project.basedir}/src/main/resources</directory>
        <includes>
          <include>*.properties</include>
        </includes>
      </resource>
    </resources>
    <!--开启测试目录下资源文件过滤-->
    <testResources>
      <testResource>
        <filtering>true</filtering>
        <directory>${project.basedir}/src/test/resources</directory>
        <!--包括哪些-->
        <includes>
          <include>*.properties</include>
        </includes>
        <!--排除哪些-->
        <!--<excludes>-->
          <!--<exclude>*.xml</exclude>-->
        <!--</excludes>-->
      </testResource>
    </testResources>
  </build>

配置好之后,编译打包时,maven插件会将资源文件中引用到maven属性的地方的字符串替换成maven属性的值,生成打包后的文件。

目前准备工作已经做完了,直接使用如下命令就可以激活profile来构建项目。

mvn clean package -Dmaven.test.skip=true -Pdev

参数说明:

-Dmaven.test.skip=true 指定构建的时候跳过测试代码的编译和测试。

-P指定激活的profile
,这里的dev就是pom文件中对应的profile的id,可以指定多个profile,profile之间用逗号隔开。

那么,如果我们想在开发的时候使用默认的一个profile,省去构建的时候指定-P参数的传入,可以在默认的profile配置中指定activation的activeByDefault为true,如下:


<profile>
        <id>dev</id>
        <properties>
            <db.driver>com.mysql.jdbc.Driver</db.driver>
            <db.username>root</db.username>
            <db.password>vinfung77</db.password>
            <db.url>jdbc:mysql:///dev?useSSL=true</db.url>
        </properties>
        <!--默认激活-->
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
</profile>

profile 的种类

  • pom.xml文件中指定的profile
  • 用户settings.xml文件,.m2/settings.xml中指定的profile
  • 全局settings.xml文件,conf/settings.xml中指定的profile

setting.xml


<?xml version="1.0" encoding="UTF-8"?>

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    
  //此处省略其他无关的
  
  
  <profiles>
    //在这里配置profile
  </profiles>

  <!-- 指定默认激活哪些profile
  <activeProfiles>
    <activeProfile>alwaysActiveProfile</activeProfile>
    <activeProfile>anotherAlwaysActiveProfile</activeProfile>
  </activeProfiles>
  -->
</settings>

    原文作者:Coder_Ring
    原文地址: https://www.jianshu.com/p/ed225bc587a4
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞