随笔 - 684  文章 - 0  评论 - 156  阅读 - 399万

maven如何过滤占位符

今天遇到一个问题,就是properties文件中赋值用的这种形式${xxx},真正的值是配置在pom的profile中,但是未生效。

后来找到原因,原来是pom中少了一段代码:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
<build>
        <resources>
            <resource>
                <directory>${project.basedir}/src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>${project.basedir}/bin</directory>
                <targetPath>/bin</targetPath>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

  

 

关于profile的详细介绍参见如下:

 

使用maven管理项目有一个好处是就是可以针对不同的环境使用不同的编译打包设置,方便了多环境下的打包部署,一般我们开发项目都会有至少开发环境和正式环境两个,针对这两个环境的配置信息也会有所不同,比如数据库的配置等。我们可以使用maven的profile定义来进行区分,比如我们在项目的pom文件中定义如下片段:

  1. <project>
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>cc.mzone</groupId>
  4. <artifactId>myjar</artifactId>
  5. <version>0.1</version>
  6. <packaging>jar</packaging>
  7. <build>
  8. <resources>
  9. <resource>
  10. <directory>src/main/resources</directory>
  11. <includes>
  12. <include>*.*</include>
  13. </includes>
  14. <filtering>true</filtering>
  15. </resource>
  16. </resources>
  17. </build>
  18.  
  19. <properties>
  20. <jdbc.url>jdbc:mysql://localhost:3306/abc</jdbc.url>
  21. <jdbc.username>root</jdbc.username>
  22. <jdbc.password>root</jdbc.password>
  23. </properties>
  24.  
  25. <profiles>
  26. <profile>
  27. <id>product</id>
  28. <properties>
  29. <jdbc.url>jdbc:mysql://localhost:3306/abc123</jdbc.url>
  30. <jdbc.username>rootuser</jdbc.username>
  31. <jdbc.password>rootpwd</jdbc.password>
  32. </properties>
  33. </profile>
  34. </profiles>
  35. </project>

      这里我们在pom文件中定义了数据库的相关配置,同时定义了一个profile,其id为product,同时在这个profile中也定义了数据库的相关配置。这样我们使用mvn package命令时就可以使用默认的jdbc设置,当我们使用mvn package -P product时maven就会自动使用id为product的profile中的数据库配置,这个是maven读取属性配置文件的覆盖。

      然后再看pom文件中的resources段的配置:

  1. <resources>
  2. <resource>
  3. <directory>src/main/resources</directory>
  4. <includes>
  5. <include>*.*</include>
  6. </includes>
  7. <filtering>true</filtering>
  8. </resource>
  9. </resources>

      其中最重要的是<filtering>true</filtering>这段,这个配置的意思是过滤上面指定属性文件中的占位符,占位符是${变量名称}这样的形式,maven会自动读取配置文件,然后解析其中的占位符,使用上面pom文件中定义的属性进行替换。我们可以在src/main/resources下定义一个jdbc.properties配置文件,内容如下:

1
2
3
4
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.username=${jdbc.username}
jdbc.password=${jdbc.password}

  

      执行的效果如下:

1
2
3
4
5
## 使用默认的配置信息
mvn clean package
  
## 使用product环境的配置信息
mvn clean package -P product

  

分两次执行上面的命令后,然后到项目的target目录下查看打包后的结果,可以看到jdbc.properties文件的内容随着打包的参数不同而变化了,从而也就实现了我们多环境的配置自动打包了。

posted on   @ 小浩  阅读(2853)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示