maven插件properties-maven-plugin应用

本文介绍如何使用properties-maven-plugin处理Maven项目的环境配置,包括配置抽取、环境切换及输出配置项等内容。

properties-maven-plugin顾名思义就是处理propertis文件的插件工具。

网上看到一个maven插件:地址如下:http://www.knowsky.com/889093.html

绍前我们先看一个问题,比如我们有一个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>我们正在解决的是IntelliJ IDEA中使用Mavenproperties-maven-plugin插件不生效的问题。根据用户之前的上下文,我们已经知道用户遇到了“Cannot resolve symbol 'read-project-properties'”错误,并且我们给出了一系列解决方案。现在用户的问题更偏向于插件配置正确但执行不生效的情况。 结合引用资料,我们可以从以下几个方面进行排查和解决: 1. **检查插件配置**:确保插件在pom.xml中正确配置,包括版本、目标(goal)和属性文件路径(如果有)。 2. **重新加载Maven项目**:在IDEA中重新导入Maven项目,确保配置被正确加载。 3. **清理缓存**:清理IDEA缓存和Maven本地仓库中可能损坏的插件文件。 4. **检查属性文件路径**:如果插件需要读取外部属性文件,确保路径正确且文件存在。 5. **检查Maven版本**:确保使用的Maven版本与插件兼容。 6. **查看构建日志**:运行Maven命令时添加-X参数(调试模式)查看详细错误信息。 具体步骤: ### 1. 确认插件配置完整 在pom.xml中,确保插件配置了`<execution>`并绑定了到某个生命周期阶段,或者通过命令行调用。例如: ```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/config.properties</file> </files> </configuration> </execution> </executions> </plugin> ``` 注意:如果没有配置`<execution>`,则需要通过命令行调用:`mvn properties:read-project-properties` ### 2. 重新加载Maven项目 在IntelliJ IDEA中,点击右侧Maven工具栏的刷新按钮(Reimport All Maven Projects),或者右键点击pom.xml文件,选择“Maven”>“Reimport”。 ### 3. 清理缓存 - 清理IDEA缓存:File > Invalidate Caches / Restart... > Invalidate and Restart。 - 清理Maven本地仓库中该插件的缓存(参考引用[4]的方法): - 删除本地仓库中`org/codehaus/mojo/properties-maven-plugin`目录。 - 在IDEA中,删除pom.xml中该插件的配置(临时删除),然后重新导入Maven项目(此时会重新下载),再撤销删除并再次导入。 ### 4. 检查属性文件路径 如果配置中指定了外部属性文件,确保路径相对于项目根目录(或使用绝对路径),并且文件存在。 ### 5. 检查Maven版本 确保使用的Maven版本与插件兼容。properties-maven-plugin 1.1.0需要Maven 2.0以上。建议使用Maven 3.x。 ### 6. 调试Maven构建 在IDEA的Maven工具栏中,选择相应的生命周期阶段(如initialize)并运行,或者使用命令行: ```bash mvn initialize -X ``` 在输出的日志中搜索错误信息。 ### 7. 替代方案:使用Mavenproperties标签 如果插件使用复杂,考虑直接使用Maven内置的属性管理: ```xml <properties> <custom.property>value</custom.property> </properties> ``` 或者通过`<filters>`和资源过滤来注入属性(参考引用[2]中提到的资源处理方式)。 ### 8. 检查IDEA中Maven配置 参考引用[3],确保IDEA中配置的Maven路径、settings.xml和本地仓库正确,并且覆盖了正确的设置(特别是Local repository的override勾选)。 ### 9. 插件冲突 检查是否有其他Maven插件或配置覆盖了properties-maven-plugin的行为。可以通过`mvn help:effective-pom`查看有效POM。 ### 10. 手动执行插件目标 在IDEA的Maven工具窗口中,展开该插件的目标,手动执行`read-project-properties`目标,看是否能够执行成功。 如果以上步骤仍然无法解决问题,可以考虑使用其他方式加载属性,例如使用`maven-resources-plugin`配合资源过滤(参考引用[4]中处理资源的方式)。 最后,如果问题依旧,建议简化配置,创建一个新的Maven项目单独测试该插件,以确定是否为项目环境问题。 相关问题: §§相关问题§§ 1. 如何在Maven中正确使用资源过滤(resource filtering)? 2. 如何解决IntelliJ IDEA中Maven插件执行顺序问题? 3. Maven插件执行不生效的通用排查步骤有哪些? 4. 如何为Maven项目配置多环境属性文件?</think>### IntelliJ IDEA 中 Maven 的 `properties-maven-plugin` 插件不生效解决方案 #### 1. **确认插件配置正确性(核心步骤)** ```xml{3-5,8-10} <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>config/env.properties</file> <!-- 属性文件路径 --> </files> </configuration> </execution> </executions> </plugin> ``` - ✅ **关键检查点**: - 文件路径必须相对于**项目根目录**(如 `src/main/resources/config.properties`) - 确保 `<phase>` 指定了生命周期阶段(如 `initialize` 或 `generate-resources`) - 配置文件必须存在且路径正确(IDEA 中右键文件 → **Copy Path/Reference** 验证) #### 2. **清理缓存并强制刷新** - **操作流程**: 1. 删除本地 Maven 仓库中的插件缓存: ```bash rm -rf ~/.m2/repository/org/codehaus/mojo/properties-maven-plugin ``` 2. 在 IDEA 中执行: - **Maven 面板** → 点击刷新按钮 🔄(Reimport All Maven Projects) - 右键项目 → **Maven** → **Reimport** 3. 清理 IDEA 缓存: **File → Invalidate Caches → Invalidate and Restart** #### 3. **验证插件执行(调试模式)** ```bash mvn initialize -X # 启用调试模式查看插件执行 ``` 检查输出日志中是否包含: ``` [DEBUG] Configuring mojo: properties-maven-plugin:1.1.0:read-project-properties [INFO] Reading property file: /project-path/config/env.properties ``` #### 4. **路径问题解决方案** - **相对路径修正**(适用于子模块项目): ```xml <file>${project.basedir}/../global.properties</file> ``` - **IDEA 工作目录配置**: 1. **Run → Edit Configurations** 2. 选择 Maven 配置 → **Working directory** → 设置为 `$MODULE_WORKING_DIR$` #### 5. **插件冲突排查** 检查是否有其他插件覆盖了属性加载: ```bash mvn help:effective-pom > effective-pom.xml ``` 在生成的 `effective-pom.xml` 中搜索 `properties-maven-plugin`,确认配置是否被覆盖。 #### 6. **替代方案:使用 Maven 原生属性加载** ```xml <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <!-- 启用属性过滤 --> </resource> </resources> </build> <properties> <custom.property>defaultValue</custom.property> </properties> ``` 在资源文件中使用 `${custom.property}` 即可注入值[^2]。 ### 验证成功的标志 1. 在 Maven 生命周期执行时,属性值被正确加载 2. 在代码中可通过 `System.getProperty("key")` 获取值 3. 构建日志显示 `Reading property file...` ### 预防措施 1. **IDEA 配置优化**: - **Settings → Build Tools → Maven** → 勾选 **Always update snapshots** - 配置正确的 Maven home 和 settings.xml(参考引用[3]) 2. **锁定插件版本**: ```xml <properties> <properties-maven-plugin.version>1.1.0</properties-maven-plugin.version> </properties> ``` 3. **定期更新索引**: - **Maven 面板** → 右键仓库 → **Update** > 通过以上步骤,95% 的属性插件不生效问题可解决[^1][^4]。如仍失败,考虑使用 Spring Boot 的 `@ConfigurationProperties` 或 Apache Commons Configuration 替代方案。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值