Maven属性

【Maven】可以自定义一个或多个属性,但是事实上【自定义属性】仅是 6 类【Maven】属性中的其一。【Maven】总的来说有以下几种属性类型:

  • 【内置属性】
    • ${basedir},项目根目录
    • ${version},项目版本
  • 【POM属性】
    • ${project.artifactId},对应了<project>元素中的<artifactId>元素的值
    • ${project.build.sourceDirectory},项目的主源码目录
    • ${project.build.testSourceDirectory},项目的测试目录
    • ${project.build.directory}:项目构建输出目录
    • ${project.outputDirectory}:项目主代码编译输出目录
    • ${project.testOutputDirectory}:项目测试代码编译输出目录
    • ${project.groupId}:项目的groupId
    • ${project.artifactId}:项目的artifactId
    • ${project.version}:项目的版本号
    • ${project.build.finalName}:打包输出文件名,默认为${project.artifactId}-${project.version}
  • 【自定义属性】:在<properties>元素里添加自定义标签:

    1. <properties>
    2. <my.prop>hello</my.prop>
    3. </properties>

    pom.xml中的其他地方使用${my.prop}时,就会被替换成hello

  • 【Settings属性】:以settings.开头来引用settings.xml里的属性。比如引用${settings.localRepository},则会读取settings.xml里面的<localRepository>元素的值

  • 【Java系统属性】:所有 Java系统属性 都可以用Maven引用,比如${user.home}指向了用户目录。用户可以使用mvn help:system 来查看所有的 Java系统属性。
  • 【环境变量属性】:所有环境变量都可以以 env.开头来引用。比如${env.JAVA_HOME}就能引用环境变量中的JAVA_HOME的值。用户可以使用mvn help:system查看所有的环境变量。

构建环境

通过配置多个 <profile> 可以实现不同环境下的不同配置:

<profiles>
    <profile>
        <id>dev</id>
        <properties>
              <db.driver>com.mysql.jdbc.Driver</db.driver>
              <db.url>jdbc:mysql://127.0.0.1:3306/test</db.url>
              <db.username>dev</db.username>
              <db.password>dev-pwd</db.password>
            <build.profile.id>dev</build.profile.id>
        </properties>
    </profile>
      <profile>
          <id>prod</id>
          <properties>
              <db.driver>com.mysql.jdbc.Driver</db.driver>
              <db.url>jdbc:mysql://mysq.codeleven.com:3306/prod</db.url>
              <db.username>root</db.username>
              <db.password>root</db.password>
            <build.profile.id>prod</build.profile.id>
          </properties>
      </profile>
</profiles>

随后在 xxx.properties 里使用变量${db.driver}${db.url}。随后使用mvn -Pdev来激活dev profile,使用mvn -Ptest来激活test profile
激活了一个profile并不意味着已经结束了,我们配置的属性都会替换哪些配置文件呢?总不能把所有输出的文件都进行替换把?所以有了<filtering>元素,我们需要指定哪些目录需要打包到输出文件夹里哪些目录是需要特殊处理的(替换占位符)

<profiles>
    <profile>
        <id>test</id>
        <properties>
            <db.driver>com.mysql.jdbc.Driver</db.driver>
            <db.url>jdbc:mysql://127.0.0.1:3306/test</db.url>
            <db.username>dev</db.username>
            <db.password>dev-pwd</db.password>
        </properties>
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                    <filtering>true</filtering>    <!-- 指示需要将src/main/resources文件输出到classes目录下,并且需要对 xxx.xml、xxx.properties 类型的文件进行过滤(特殊处理) -->
                </resource>
            </resources>
        </build>
    </profile>
</profiles>

激活Profile方式

命令行激活

mvn clean install -Pdev-x,dev-y
激活dev-xdev-y两个profile

settings文件显示激活

如果希望某个profile作为默认激活选项,可以配置settings.xml里的<activeProfiles>元素。

<settings>
  <activeProfiles>
    <activeProfile>dev-x</activeProfile>
  </activeProfiles>
</settings>

配置了该选项后,那么所有pom.xml都默认激活dev-x<profile>

系统属性激活

用户可以根据 某个系统属性 来决定是否激活该profile

<profiles>
    <profile>
        <id>dev</id>
          <activation>
              <property>
              <name>test</name>
              <value>x</value>    <!-- 只有Maven环境中同时有 test 和 x 才会激活 -->
              </property>
          </activation>
        <properties>
              <db.driver>com.mysql.jdbc.Driver</db.driver>
              <db.url>jdbc:mysql://127.0.0.1:3306/test</db.url>
              <db.username>dev</db.username>
              <db.password>dev-pwd</db.password>
            <build.profile.id>dev</build.profile.id>
        </properties>
    </profile>
</profiles>

当系统属性中存在<name>字段,那么就激活profile=dev。换句话说,通过-DpropertyKey=propertyVal来设置,和命令行激活十分相似。

操作系统环境激活

用户可以根据操作系统环境来激活profile

<profiles>
    <profile>
        <id>dev</id>
          <activation>
              <os>
              <name>Windows XP</name>
              <family>Windows</family>
              </os>
          </activation>
        <properties>
              <db.driver>com.mysql.jdbc.Driver</db.driver>
              <db.url>jdbc:mysql://127.0.0.1:3306/test</db.url>
              <db.username>dev</db.username>
              <db.password>dev-pwd</db.password>
            <build.profile.id>dev</build.profile.id>
        </properties>
    </profile>
</profiles>

只有操作系统名字是Windows XP且操作系统系列是Windows才激活这个profile=dev

默认激活

<profiles>
    <profile>
        <id>dev</id>
          <activation>
              <activeByDefault>true</activeByDefault>
          </activation>
        <properties>
              <db.driver>com.mysql.jdbc.Driver</db.driver>
              <db.url>jdbc:mysql://127.0.0.1:3306/test</db.url>
              <db.username>dev</db.username>
              <db.password>dev-pwd</db.password>
            <build.profile.id>dev</build.profile.id>
        </properties>
    </profile>
</profiles>

使用activeByDefault元素可以默认使用profile来激活。倘若此时有其他的<profile>被激活了,那么<activeByDefault><profile>就不会生效。换句话说,仅在没有其他<profile>生效的情况下,默认激活的 <profile> 才会生效。

企业级使用

在实际使用过程中,不会直接在 <profile> 内的 <properties> 元素里直接配置项目,而是会把各个环境的配置文件分别放到各自的一个文件夹里。打个比方:

  • 所有dev的配置,会放在src/main/resources/dev/文件夹下
  • 所有beta的配置,会放在src/main/resources/beta/文件夹下
  • 所有test的配置,会放在src/main/resources/test/文件夹下
  • 所有staging的配置,会放在src/main/resources/staging/文件夹下
  • 所有prod的配置,会放在src/main/resources/prod/文件夹下

然后仍然利用之前的<profile>机制来决定将 哪个环境的配置文件夹 输出到约定好的 classes/目录下:

<profiles>
  <!-- Dev 环境的配置 -->
    <profile>
        <id>dev</id>
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources/dev</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>
            </resources>
        </build>
    </profile>
  <!-- Beta 环境的配置 -->
  <profile>
        <id>dev</id>
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources/beta</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>
            </resources>
        </build>
    </profile>
    <!-- Test 环境的配置 -->
  <profile>
        <id>dev</id>
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources/test</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>
            </resources>
        </build>
    </profile>
  ...
</profiles>

这样只需要激活某一个profile,那么对应的环境的配置文件就会输出到classes/目录里。