maven多profile一探究竟

作者: kk少年 | 来源:发表于2018-03-22 22:58 被阅读109次

    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
    • {project.build.finalName}项目打包输出的文件名称,默认为{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>
    
    

    相关文章

      网友评论

      本文标题:maven多profile一探究竟

      本文链接:https://www.haomeiwen.com/subject/pcgzqftx.html