Apache Maven profile详解和资源属性过滤

本文详细介绍了如何在Maven项目中使用profile来管理不同运行环境,包括默认profile配置、环境信息激活、命令行激活,以及资源属性和文件过滤的应用。通过实例演示,展示了如何根据JDK版本、操作系统和文件属性动态调整构建配置。
摘要由CSDN通过智能技术生成

1. 概述

profile有侧面的含义,项目有很多个运行环境,比如开发环境、测试环境、生产环境,每一个运行环境相当于是项目整体的一个侧面

所以profile可以给不同的运行环境定义不同的pom配置属性,然后根据需要激活一个运行环境

2. 默认profile

pom.xml中,project标签下除了modelVersion和module的坐标标签之外,其它标签都是在设定默认的profile。所以其它标签都可以配置到我们自己定义的profile中

3. profile配置

profile可以在下面两种配置文件中配置:

  • settings.xml:全局生效。比如全局配置JDK 1.11
  • pom.xml:当前POM生效

语法要求

  • profiles/profile标签

由于profile标签覆盖了pom.xml中的默认配置,所以profiles标签通常是pom.xml中的最后一个标签

  • id标签

每个profile都必须有一个id标签,指定该profile的唯一标识。这个id标签的值会在命令行调用profile时被用到。这个命令格式是:-Pprofile id

  • 其它允许出现的标签

一个profile可以覆盖项目的最终名称、项目依赖、插件配置等各个方面以影响构建行为

build
    defaultGoal
    finalName
    resources
    testResources
    plugins
reporting
modules
dependencies
dependencyManagement
repositories
pluginRepositories
properties

4. 激活profile

4.1 基于环境信息激活

环境信息包含:JDK 版本、操作系统参数、文件、属性等各个方面。一个profile 一旦被激活,那么它定义的所有配置都会覆盖原来POM中对应层次的元素。可以参考下面的标签结构

  <profiles>
    <profile>
      <!-- profile的唯一ID -->
      <id>dev</id>

      <!-- 激活条件 -->
      <activation>
        <!-- 配置是否默认激活 -->
        <activeByDefault>false</activeByDefault>
        <jdk>11</jdk>
        <os>
          <name>windows 10</name>
          <family>windows</family>
          <arch>amd64</arch>
          <version>10.0</version>
        </os>
        <property>
          <name>mavenVersion</name>
          <value>3.8.6</value>
        </property>
        <file>
          <exists>test1.properties</exists>
          <missing>test2.properties</missing>
        </file>
      </activation>

      <!-- 如果profile被激活,则使用下面的pom配置 -->
      <build>
        <pluginManagement>
          <plugins>
            <plugin>
              <artifactId>maven-resources-plugin</artifactId>
              <version>3.2.0</version>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </profile>
  </profiles>

说明:

  • 如果activeByDefault为false,需要activation里面的所有条件都符合,才能激活该profile
  • Maven会自动检测当前环境安装的JDK版本,只要JDK版本是以11开头都算符合条件。比如这几个都符合:11.0.1、11.0.15

4.2 命令行激活

列出活动的profile,以及它们在哪里定义

C:\Users\dell\Desktop\maven-learn>mvn help:active-profiles
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------------------< com.hh:maven-learn >-------------------------
[INFO] Building maven-learn 0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-help-plugin:3.2.0:active-profiles (default-cli) @ maven-learn ---
[INFO] 
Active Profiles for Project 'com.hh:maven-learn:jar:0.1':

The following profiles are active:

 - jdk-11 (source: external)



[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.922 s
[INFO] Finished at: 2022-06-30T21:25:24+08:00
[INFO] ------------------------------------------------------------------------

C:\Users\dell\Desktop\maven-learn>

这是我们在settings.xml中定义了一个id为jdk-11的profile,且默认激活

指定某个具体profile进行激活。这里我们以上面定义的profile为例

C:\Users\dell\Desktop\maven-learn>mvn compile -Pdev
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------------------< com.hh:maven-learn >-------------------------
[INFO] Building maven-learn 0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ maven-learn ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Using 'null' encoding to copy filtered properties files.
[INFO] skip non existing resourceDirectory C:\Users\dell\Desktop\maven-learn\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven-learn ---
[INFO] Nothing to compile - all classes are up to date
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.973 s
[INFO] Finished at: 2022-06-30T21:32:21+08:00
[INFO] ------------------------------------------------------------------------

C:\Users\dell\Desktop\maven-learn>

如果不激活dev这个profile,默认使用的maven-resources-plugin插件是2.6版本的。激活后使用的maven-resources-plugin插件版本是我们在profile中定义的3.2.0

5. 资源属性过滤

Maven可以通过profile实现各种不同运行环境切换,提供了一种资源属性过滤的机制。通过属性替换实现不同环境使用不同的参数

定义profile如下:

  <profiles>
    <profile>
      <id>devJDBCProfile</id>
      <properties>
        <dev.jdbc.driver>com.mysql.cj.jdbc.Driver</dev.jdbc.driver>
        <dev.jdbc.url>http://localhost:3306/information_schema</dev.jdbc.url>
        <dev.jdbc.user>root</dev.jdbc.user>
        <dev.jdbc.password>Root_123</dev.jdbc.password>
      </properties>
      <build>
        <resources>
          <resource>
            <!-- 将资源过滤功能打开 -->
            <filtering>true</filtering>
            
            <!-- 表示为这里指定的目录开启资源过滤功能 -->
            <directory>${project.basedir}/src/main/resources</directory>
          </resource>
        </resources>
      </build>
    </profile>
  </profiles>

src/main/resources/jdbcTest.properties文件内容如下:

jdbc.driver=${dev.jdbc.driver}
jdbc.url=${dev.jdbc.url}
jdbc.user=${dev.jdbc.user}
jdbc.password=${dev.jdbc.password}

然后执行资源处理命令

C:\Users\dell\Desktop\maven-learn>mvn clean resources:resources -PdevJDBCProfile
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------------------< com.hh:maven-learn >-------------------------
[INFO] Building maven-learn 0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ maven-learn ---
[INFO] Deleting C:\Users\dell\Desktop\maven-learn\target
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-cli) @ maven-learn ---
[WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 1 resource
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.633 s
[INFO] Finished at: 2022-06-30T21:50:51+08:00
[INFO] ------------------------------------------------------------------------

C:\Users\dell\Desktop\maven-learn>

生成的target/classes/jdbcTest.properties文件的内容如下:

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=http://localhost:3306/information_schema
jdbc.user=root
jdbc.password=Root_123

6. 资源文件过滤

可以在resource标签下,使用includes和excludes标签,在resource阶段包含或排除一些资源文件

定义profile如下:

  <profiles>
    <profile>
      <id>devJDBCProfile</id>
      <build>
        <resources>
          <resource>
            <!-- 将资源过滤功能打开 -->
            <filtering>true</filtering>
            
            <!-- 表示为这里指定的目录开启资源过滤功能 -->
            <directory>${project.basedir}/src/main/resources</directory>
            
            <includes>
              <include>*.txt</include>
            </includes>
            <excludes>
              <exclude>test2.properties</exclude>
            </excludes>
          </resource>
        </resources>
      </build>
    </profile>
  </profiles>

src/main/resources目录下新建文件test1.txt和test2.properties

然后执行资源处理命令

C:\Users\dell\Desktop\maven-learn>mvn clean resources:resources -PdevJDBCProfile
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------------------< com.hh:maven-learn >-------------------------
[INFO] Building maven-learn 0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ maven-learn ---
[INFO] Deleting C:\Users\dell\Desktop\maven-learn\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-cli) @ maven-learn ---
[WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 1 resource
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.563 s
[INFO] Finished at: 2022-06-30T21:59:47+08:00
[INFO] ------------------------------------------------------------------------

C:\Users\dell\Desktop\maven-learn>

在target/classes目录下,只有test1.txt

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值