学习Maven之Properties Maven Plugin

本文详细介绍如何使用properties-maven-plugin插件来管理Maven项目的配置文件,包括如何将配置项从pom.xml文件中提取到独立的properties文件,并通过不同的环境配置实现灵活的打包流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:http://www.cnblogs.com/qyf404/p/4833261.html?utm_source=tuicool&utm_medium=referral


1.properties-maven-plugin是个什么鬼?

介绍前我们先看一个问题,比如我们有一个maven项目结构如下:

一般我们都把一些配置文件放到像src/main/resources/jdbc.properties这样的文件中。但是文件里我们更多的放的还是变量,内容如下:

jdbc.driverClassName=${jdbc.driverClassName}
jdbc.url=${jdbc.url}
jdbc.username=${jdbc.username}
jdbc.password=${jdbc.password}
jdbc.validationQuery=${jdbc.validationQuery}

具体的值我们会放到pom.xml中,用<properties>来配置,如下所示代码:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.qyf404</groupId>
   <artifactId>learn-maven</artifactId>
    <version>1.0-SNAPSHOT</version>
    <profiles></profiles>
    <properties>
        <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>
        <jdbc.url>jdbc:mysql://localhost/stock?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true</jdbc.url>
        <jdbc.username>root</jdbc.username>
        <jdbc.password></jdbc.password>
        <jdbc.validationQuery>SELECT 1 + 1</jdbc.validationQuery>
    </properties>
    <build>
        <resources>
            <resource>
                <filtering>true</filtering>
                <directory>${project.basedir}/src/main/resources</directory>
                <includes>
                    <include>*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>
</project>

按照上面的方式配置。我们执行mvn package后,在target/classes/jdbc.properties里可以看到配置文件被成功替换。

由于某些原因(比如配置文件项比较多,为了让pom.xml更精简),我们希望把这些配置项提取到一个properties文件中进行配置。
这时候就需要用到properties-maven-plugin了。properties-maven-plugin可以在执行maven命令时,读取指定properties文件中的配置项,来实现和pom.xml中配置<properties>一样的效果。


2.properties-maven-plugin怎么用?

还拿上面的例子说,比如我们把pom.xml中的配置项放到一个全局的my.properties中。

profiles/dev/my.properties文件内容如下:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/stock?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true
jdbc.username=root
jdbc.password=
jdbc.validationQuery=SELECT 1 + 1

pom.xml我们把插件加进去,并把之前里面的配置项注释掉.

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qyf404</groupId>
<artifactId>learn-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!--<properties>-->
    <!--<jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>-->
    <!--<jdbc.url>jdbc:mysql://localhost/stock?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true</jdbc.url>-->
    <!--<jdbc.username>root</jdbc.username>-->
    <!--<jdbc.password></jdbc.password>-->
    <!--<jdbc.validationQuery>SELECT 1 + 1</jdbc.validationQuery>-->
<!--</properties>-->
<build>
    <resources>
        <resource>
            <filtering>true</filtering>
            <directory>${project.basedir}/src/main/resources</directory>
            <includes>
                <include>*.properties</include>
            </includes>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>properties-maven-plugin</artifactId>
            <version>1.0-alpha-2</version>
            <executions>
                <execution>
                    <id>default-cli</id>
                    <phase>initialize</phase>
                    <goals>
                        <goal>read-project-properties</goal>
                    </goals>
                    <configuration>
                        <files>
                            <file>${user.dir}/profiles/dev/my.properties</file>
                        </files>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
</project>

我们执行mvn package后,在target/classes/jdbc.properties里可以看到配置文件被成功替换。


3.进阶

pom.xml里的配置项提取到properties文件中,这是properties-maven-plugin干的事情。但是我们用properties-maven-plugin要达到更好的效果。

想一个场景:

  • 我们的项目有开发环境的配置,测试环境的配置;
  • 而且开发环境是mysql数据库,测试环境是hsqldb数据库;
  • 最后还要在一个文件中统一打印出配置项内容。

我们可以通过maven的profile来配上properties-maven-plugin实现针对不同环境的快速打包。

我们把项目做个改造,结构如下:

profiles/dev/my.properties内容如下:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/stock?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true
jdbc.username=root
jdbc.password=
jdbc.validationQuery=SELECT 1 + 1

profiles/test/my.properties内容如下:

jdbc.driverClassName=org.hsqldb.jdbc.JDBCDriver
jdbc.url=jdbc:hsqldb:hsql://localhost/stocktest
jdbc.username=root
jdbc.password=
jdbc.validationQuery=SELECT 1 + 1

pom.xml 内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qyf404</groupId>
<artifactId>learn-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!--<properties>-->
<!--<jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>-->
<!--<jdbc.url>jdbc:mysql://localhost/stock?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true</jdbc.url>-->
<!--<jdbc.username>root</jdbc.username>-->
<!--<jdbc.password></jdbc.password>-->
<!--<jdbc.validationQuery>SELECT 1 + 1</jdbc.validationQuery>-->
<!--</properties>-->
<build>
    <resources>
        <resource>
            <filtering>true</filtering>
            <directory>${project.basedir}/src/main/resources</directory>
            <includes>
                <include>*.properties</include>
            </includes>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>properties-maven-plugin</artifactId>
            <version>1.0-alpha-2</version>
            <executions>
                <execution>
                    <id>default-cli</id>
                    <phase>initialize</phase>
                    <goals>
                        <goal>read-project-properties</goal>
                        <goal>write-project-properties</goal>
                    </goals>
                    <configuration>
                        <files>
                            <!--<file>${user.dir}/profiles/dev/my.properties</file>-->
                            <file>${user.dir}/profiles/${profile.id}/my.properties</file>
                        </files>
                        <!--输出全部配置项到指定文件-->
                        <outputFile>${build.directory}/profile.properties</outputFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <profile.id>dev</profile.id>
        </properties>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.31</version>
                <scope>runtime</scope>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>test</id>
        <properties>
            <profile.id>test</profile.id>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.hsqldb</groupId>
                <artifactId>hsqldb</artifactId>
                <version>2.2.6</version>
                <scope>runtime</scope>
            </dependency>
        </dependencies>
    </profile>
</profiles>
</project>

我们现在只需要执行命令mvn package -Pdev或者mvn package就可以打一个开发的包。

执行命令mvn package -Ptest就可以打一个测试用的包。

而且在target/profile.properties里查看项目打包的全部maven用到的配置项。内容如下:

#Properties
#Wed Sep 23 19:06:47 CST 2015
jdbc.url=jdbc\:mysql\://localhost/stock?createDatabaseIfNotExist\=true&amp;useUnicode\=true&amp;characterEncoding\=utf-8&amp;autoReconnect\=true
jdbc.username=root
jdbc.validationQuery=SELECT 1 + 1
jdbc.password=
profile.id=dev
jdbc.driverClassName=com.mysql.jdbc.Driver

示例代码github地址: https://github.com/qyf404/learn-maven/tree/properties-maven-plugin

更多关于properties-maven-plugin请参阅这里:http://www.mojohaus.org/properties-maven-plugin/index.html

作者: 辵鵵


<think>我们正在讨论如何使用properties-maven-plugin插件在Maven项目中加载外部属性文件。根据引用[1],该插件的主要用途是将配置项从pom.xml中提取到外部的properties文件中,以保持pom.xml的简洁。下面我将详细介绍如何使用该插件。 ### 基本使用步骤 #### 1. 添加插件配置 在项目的pom.xml文件中,添加以下插件配置: ```xml <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>properties-maven-plugin</artifactId> <version>1.1.0</version> <executions> <execution> <!-- 在初始化阶段读取属性文件 --> <phase>initialize</phase> <goals> <goal>read-project-properties</goal> </goals> <configuration> <!-- 指定属性文件路径 --> <files> <file>src/main/resources/config.properties</file> </files> </configuration> </execution> </executions> </plugin> </plugins> </build> ``` #### 2. 创建属性文件 在指定的路径(如`src/main/resources/config.properties`)创建属性文件,内容示例: ```properties # config.properties db.url=jdbc:mysql://localhost:3306/mydb db.user=admin db.password=secret ``` #### 3. 在POM中使用属性 加载后,属性文件中的键值对会变成Maven属性,可以在POM的任何地方使用`${key}`引用: ```xml <properties> <!-- 可以直接使用属性文件中定义的键 --> <database.url>${db.url}</database.url> </properties> ``` #### 4. 在资源过滤中使用 如果开启了资源过滤,也可以在资源文件中使用这些属性。首先在POM中启用资源过滤: ```xml <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> ``` 然后在资源文件(如`src/main/resources/application.properties`)中引用: ```properties # application.properties database.url=@db.url@ ``` 注意:在资源文件中,Maven属性通常用`@`符号包围(也可以配置为`${}`,但需要额外设置)。 ### 高级配置 #### 加载多个文件 可以同时加载多个属性文件: ```xml <configuration> <files> <file>file1.properties</file> <file>file2.properties</file> </files> </configuration> ``` #### 使用相对路径 可以使用Maven内置变量指定路径,如`${basedir}`表示项目根目录: ```xml <file>${basedir}/../shared-config.properties</file> ``` #### 环境特定配置 结合Maven profiles,可以为不同环境加载不同属性文件: ```xml <profiles> <profile> <id>dev</id> <build> <plugins> <plugin> <!-- 覆盖默认配置 --> <executions> <execution> <configuration> <files> <file>src/main/resources/config-dev.properties</file> </files> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> ``` ### 注意事项 1. **属性加载顺序**:插件在`initialize`阶段执行,因此后续阶段(如资源过滤)可以使用这些属性。 2. **属性覆盖**:后加载的文件中的属性会覆盖先加载的同名属性。命令行参数`-D`设置的属性优先级最高。 3. **IDE支持**:某些IDE可能需要运行Maven命令(如`mvn initialize`)才能识别动态加载的属性。 ### 示例:数据库配置整合 **目标**:将数据库配置移至外部文件,并在POM和资源文件中使用。 **步骤**: 1. 创建`src/main/resources/db.properties`: ```properties db.driver=com.mysql.jdbc.Driver db.url=jdbc:mysql://localhost:3306/mydb db.user=root db.password=123456 ``` 2. 配置插件加载该文件: ```xml <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>properties-maven-plugin</artifactId> <version>1.1.0</version> <executions> <execution> <phase>initialize</phase> <goals> <goal>read-project-properties</goal> </goals> <configuration> <files> <file>src/main/resources/db.properties</file> </files> </configuration> </execution> </executions> </plugin> ``` 3. 在依赖中使用属性(如JDBC驱动版本): ```xml <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> <!-- 假设db.properties中定义了mysql.version=8.0.30 --> </dependency> </dependencies> ``` 4. 在资源过滤中传递属性: ```xml <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> ``` 然后在`application.properties`中: ```properties spring.datasource.url=@db.url@ spring.datasource.username=@db.user@ ``` ### 常见问题解决 - **属性未解析**:确保插件执行阶段(initialize)早于资源过滤阶段(process-resources)。 - **文件路径错误**:使用绝对路径或`${basedir}`开头的相对路径。 - **特殊字符处理**:属性文件中包含特殊字符(如`@`或`$`)时,使用`\`转义。 通过properties-maven-plugin,我们可以将配置与POM分离,提高项目的可维护性[^1]。 --- §§相关问题§§ 1. 如何在不同环境(开发/测试/生产)中使用properties-maven-plugin加载不同的配置文件? 2. properties-maven-plugin支持哪些格式的属性文件? 3. 如何在Maven插件的配置中引用动态加载的属性? 4. 使用properties-maven-plugin时如何避免属性冲突?</think>### 如何使用 properties-maven-plugin 加载属性文件 `properties-maven-plugin` 允许您在 Maven 构建过程中加载外部属性文件,使配置更简洁且易于管理。以下是详细使用指南: --- #### 1. 基本配置(加载单个属性文件) ```xml <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>properties-maven-plugin</artifactId> <version>1.1.0</version> <executions> <execution> <phase>initialize</phase> <!-- 在构建早期阶段加载 --> <goals> <goal>read-project-properties</goal> </goals> <configuration> <files> <!-- 相对当前pom.xml的路径 --> <file>src/main/resources/config.properties</file> </files> </configuration> </execution> </executions> </plugin> </plugins> </build> ``` **属性文件示例** (`config.properties`): ```properties # src/main/resources/config.properties app.version=1.0.0 db.url=jdbc:mysql://localhost:3306/mydb max.connections=50 ``` --- #### 2. 多文件加载 ```xml <configuration> <files> <file>${basedir}/config/db.properties</file> <file>${basedir}/config/security.properties</file> </files> </configuration> ``` > 注意:后加载文件的属性会覆盖先加载的同名属性 --- #### 3. 目录批量加载 ```xml <configuration> <includeDefaultValueLocations>false</includeDefaultValueLocations> <locations> <location>${basedir}/config</location> <!-- 加载目录下所有.properties文件 --> </locations> </configuration> ``` --- #### 4. 在POM中使用加载的属性 ```xml <properties> <!-- 直接引用属性文件中的键 --> <project.version>${app.version}</project.version> </properties> <dependencies> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> </dependency> </dependencies> ``` --- #### 5. 在资源过滤中使用 启用资源过滤后,可在配置文件中引用属性: ```xml <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <!-- 开启过滤 --> </resource> </resources> ``` 然后在 `application.yml` 中使用: ```yaml # src/main/resources/application.yml database: url: ${db.url} pool-size: ${max.connections} ``` --- ### 高级用法 #### 1. 环境区分配置 结合 Maven profiles 加载环境特定配置: ```xml <profiles> <profile> <id>dev</id> <build> <plugins> <plugin> <configuration> <files> <file>env/dev.properties</file> </files> </configuration> </plugin> </plugins> </build> </profile> </profiles> ``` 通过命令激活:`mvn clean install -P dev` --- #### 2. 命令行覆盖属性 ```bash mvn install -Ddb.url="jdbc:mysql://prod-db:3306/prod" ``` > 命令行参数优先级最高,会覆盖文件中的属性值 --- #### 3. 属性加密(结合 jasypt) 在属性文件中使用加密值: ```properties db.password=ENC(G6N718UuyPE5bHyWKyuLQSm02auQPUtm) ``` 需配合 jasypt-maven-plugin 解密[^1] --- ### 常见问题解决 1. **属性未生效** - 检查插件执行阶段 (`initialize` 最早) - 确认文件路径正确(使用 `${basedir}/path/file`) - 查看Maven输出日志:`mvn help:effective-pom` 2. **特殊字符处理** 在属性文件中对特殊字符转义: ```properties windows.path=C:\\Program Files\\app email.regex=^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$ ``` 3. **IDE兼容性** 在 IntelliJ/Eclipse 中需启用 Maven 导入: - IntelliJ: `Settings > Build > Build Tools > Maven > Importing > 勾选 "Import Maven projects automatically"` --- ### 最佳实践建议 1. **敏感信息管理**:将密码等敏感数据放在单独文件,并加入 `.gitignore` 2. **属性命名规范**:使用`domain.key`格式(如 `db.url`、`log.level`) 3. **默认值设置**:在属性文件中提供安全默认值 4. **版本控制**:`.properties` 文件也应纳入版本控制 > 示例项目结构: > ``` > src/ > ├── main/ > │ ├── resources/ > │ │ ├── config/ > │ │ │ ├── app.properties > │ │ │ ├── db.properties > │ │ │ └── security.properties > │ │ └── application.yml > └── pom.xml > ``` 通过 properties-maven-plugin,可实现配置与代码分离,提升项目可维护性[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值