目录

  • 背景
  • 第一部分 基本配置介绍
  • 第二部分 具体配置和注意事项
  • 第三部分 读取resources资源
  • 参考文献及资料

背景

通常Maven项目的文件目录结构如下:

# Maven项目的标准目录结构
src
main
java #源文件
resources #资源文件
filters #资源过滤文件
config #配置文件
scripts #脚本文件
webapp #web应用文件
test
java #测试源文件
resources #测试资源文件
filters #测试资源过滤文件
it #集成测试
assembly #assembly descriptors
site #Site
target
generated-sources
classes
generated-test-sources
test-classes
xxx.jar
pom.xml
LICENSE.txt
NOTICE.txt
README.txt

其中src/main/resourcessrc/test/resources是资源文件目录。本文将详细介绍资源文件相关的配置。

第一部分 基本配置介绍

我们在使用Maven组件来构建项目的时候,通常将配置文件放在资源文件目录下。针对这个目录,在pom.xml文件进行了定义,我们首先看一个案例:

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>application.properties</exclude>
</excludes>
</resource>
</resources>
</build>
  • 标签<directory>指定资源文件目录;
  • 标签 <include>指定资源文件目录中,哪些文件被打包。
  • 标签<excludes>指定资源文件目录中,哪些文件不被打包。

特别的,标签<filtering>是一个bool值,默认值为false。在maven资源文件中,支持使用变量placeholder,例如资源文件:

# application.properties
application.user=${username}
application.password=${password}

文件中使用${keyword}占位符来标识变量。这时候可以在pom.xml文件中定义变量的取值:

<properties>
<username>mysql</username>
<password>password123</password>
</properties>

如果需要对配置文件中变量进行替换实际值,就需要开启<filtering>,该值设置为true

第二部分 具体配置和注意事项

2.1 案例说明

根据上面的介绍,最开始例子中有两段resource的配置描述,分别的含义为:

  • 第一个配置的含义是:在配置文件目录src/main/resources过滤掉其他文件,只保留application.properties文件。并且开启filtering变量替换属性。

  • 第二个配置的含义是:在配置文件目录src/main/resources过滤掉application.properties文件,其他文件均保留。并且关闭filtering变量替换属性。

需要特别注意的是,这里两个<resources>都是对资源目录<src/main/resources>的配置定义,一个是保留application.properties,一个是去除application.properties。这样两个配置会不会冲突?实际上两个配置是兼容。最后是取两个配置分别过滤的文件集合的并集

可以看一下例子,资源目录src/main/resources里面有三个文件:

application.yml
application.properties
application.xml

编译后,target/classes路径中三个配置文件都是有的。第一配置文件过滤后文件集合为{application.properties},第二个配置过滤后的集合为{application.yml,application.xml},最后取并集就得到了最后编译结果。

2.2 正则过滤

在对资源目录中文件进行过滤时,还支持正则表达式。例如:

<include>**/*.xml</include>

这个表达式表示包含了资源目录下面所有xml文件(以及子目录下面)。

2.3 变量占位符

这里主要指的是<filtering>的功能。例如下面的xml文件定义了一个研发<profile>

<profiles>
<profile>
<id>dev</id>
<properties>
<resource.delimiter>${}</resource.delimiter>
<username>mysql</username>
<password>password123</password>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>

配置中定义的usernamepassword两个变量的值。使用package -P dev编译后,配置文件中占位符变量被替换:

application.user=mysql
application.password=password123

需要注意的是这里增加了<resource.delimiter>标签配置,定义了占位符的格式。有些时候其他依赖包的pom文件也会指定占位符的格式,就会造成格式不统一。例如:spring boot把默认的占位符号${}改成了@var@。所以建议进行配置,否则容易环境"污染"。

2.4 关于一个错误观点的说明

有很多关于这个主题的文章(例如CSND)中,认为同一个<resource>中,若是<include><exclude>都存在的话,那就发生冲突了,这时会以<exclude>为准。

关于这个论点,笔者实际做了实验,同一个<resource>中,同时配置了<include><exclude>

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application.properties</include>
</includes>
<excludes>
<exclude>application.properties</exclude>
</excludes>
</resource>
</resources>
</build>

编译结果,配置文件没有打包进入target/classes。说明这个论点是有问题的。说明在同一个resource中两种配置是取交集的

2.5 子目录

资源目录也是支持子目录的。即可以在资源目录下面创建子目录,在打包过程中会保留子目录结构。例如:

resources
-test
--app.xml
-application.yml
-application.properties
-application.xml

在项目编译后,如果子目录中资源文件被保留,那么子目录的结构也是保留的。例如:

target
-classes
--test
---app.xml
-application.yml
-application.properties
-application.xml

第二部分 读取resources资源

例如我们的配置文件properties类型的配置文件,可以使用下面的语句进行读取:

  • 方法1,从编译后的整个classes目录下去找;
InputStream is = this.getClass().getResourceAsStream("/" +application.properties);
  • 方法2,ClassLoader从整个classes目录找;
InputStream is = this.getClass().getClassLoader().getResourceAsStream(application.properties);

读取使用Java的工具包java.util.Properties

import java.util.Properties;

Properties properties = new Properties();
InputStream is = this.getClass().getClassLoader().getResourceAsStream(application.properties);
properties.load(is) //获取配置文件中name的配置值
System.out.println(properties.get(getProperty("name")))

其他类型的配置文件读取读者可以执行查找资料。

参考文献及资料

1、Maven Resources Plugin,链接:https://maven.apache.org/components/plugins-archives/maven-resources-plugin-2.6/

2、Maven资源过滤的配置,链接:http://c.biancheng.net/view/5285.html

更多关注公众号:

Maven项目中resources配置总结的更多相关文章

  1. Maven项目中的配置

    1 在配置好Maven项目后,新建一个Maven Project.如图 点击next,会进入如下界面: 选择webapp,不选择默认的quickstart,之后会进入以下界面 填好Group ID 和 ...

  2. 在maven项目中 配置代理对象远程调用crm

    1 在maven项目中配置代理对象远程调用crm 1.1 在项目的pom.xml中引入CXF的依赖 <dependency> <groupId>org.apache.cxf&l ...

  3. 在maven项目中解决第三方jar包依赖的问题

    在maven项目中,对于那些在maven仓库中不存在的第三方jar,依赖解决通常有如下解决方法: 方法1:直接将jar包拷贝到项目指定目录下,然后在pom文件中指定依赖类型为system,如: < ...

  4. Java项目和maven项目中如何获取&设置配置文件中的属性

    通常情况下,我们会在一些配置文件文件中配置一些属性.如: indexPath = E\:\\Tomcat_7.0\\webapps\\ipost_stage\\lucene\\index imgUpl ...

  5. IDEA的maven项目中 静态文件编译的问题

    IDEA的maven项目中,默认源代码目录下的xml等资源文件并不会在编译的时候一块打包进classes文件夹,而是直接舍弃掉. 如果使用的是Eclipse,Eclipse的src目录下的xml等资源 ...

  6. IDEA的maven项目中静态文件编译的路径问题(未测试)

    转自:http://www.cnblogs.com/signheart/p/6625126.html IDEA的maven项目中,默认源代码目录下的xml等资源文件并不会在编译的时候一块打包进clas ...

  7. Eclipse如何导入maven项目,以及配置maven

    Eclipse如何导入maven项目,以及配置maven 一.准备工作 1. eclipse,安装了eclipse 2. 一个需要导入的maven项目 3. 下载好了的压缩包apache-maven- ...

  8. Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图(转载)

    Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图 2017年04月05日 10:53:13 李学凯 阅读数:104997更多 所属专栏: Intellij Idea   ...

  9. 在Maven项目中,指定使用阿里云仓库下载jar包

    Maven项目中,在pom.xml的</project>标签之前加入一下标签,指定使用阿里云仓库下载jar包. <!-- 使用aliyun maven --> <repo ...

随机推荐

  1. Xcode 切换 iOS 模拟器的 Dark 模式

    Xcode 切换 iOS 模拟器的 Dark 模式 SwiftUI // // ContentView.swift // MemorizeGame // // Created by 夏凌晨 on 20 ...

  2. js uppercase the first letter of string

    js uppercase the first letter of string js String.toUpperCase `-webkit-border-image`.split(`-`).filt ...

  3. CSS flex waterfall layout

    CSS flex waterfall layout https://github.com/YoneChen/waterfall-flexbox https://css-tricks.com/snipp ...

  4. C++算法代码——级数求和[NOIP2002 普及组]

    题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1078 或者:https://www.luogu.com.cn/problem/P10 ...

  5. 死磕Spring之IoC篇 - 深入了解Spring IoC(面试题)

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  6. sublime 使用过程中遇到的问题

    1.当我把鼠标放置在下图所示的class上几秒钟后,sublime就会在全局查找当前的class字符,这时sublime就会出现卡顿或无响应 解决方法: 点击preferences下的settings ...

  7. react新手入坑

    1.vscode保存react项目的时候由于js-css-html插件格式化代码导致react代码缩进错误 解决方法:禁用js-css-html插件 2.react和vue不同,react方法的定义需 ...

  8. Java开发工程师最新面试题库系列——Spring部分(附答案)

    Spring Spring框架是什么? 答:Spring是轻量级的面向切面和控制反转的框架.初代版本为2002年发布的interface21,Spring框架是为了解决企业级应用开发的复杂性的出现的, ...

  9. 我ssh框架遇到报错及处理方式

    Exception encountered during context initialization - cancelling refresh attempt 修改hbm.xml后遇到的问题,错误可 ...

  10. Echars统计图的使用

    第一步去官网挑选自己需要的图形了. 官网地址:https://echarts.baidu.com/ 第二步按照官网的demo,下载需要的js组件并放到自己的项目中. 第三步仿照demo创建需要的div ...