Maven项目中怎么导入jstl Maven项目中resources配置总结

目录

  • 背景
  • 第一部分基本配置介绍
  • 第二部分 具体配置和注意事项
  • 第三部分 读取resources资源
  • 参考文献及资料
背景通常Maven项目的文件目录结构如下:
# Maven项目的标准目录结构src mainjava#源文件resources#资源文件filters#资源过滤文件config#配置文件scripts#脚本文件webapp#web应用文件 testjava#测试源文件resources#测试资源文件filters#测试资源过滤文件 it#集成测试 assembly#assembly descriptors site#Sitetargetgenerated-sourcesclassesgenerated-test-sourcestest-classesxxx.jarpom.xmlLICENSE.txtNOTICE.txtREADME.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.propertiesapplication.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.ymlapplication.propertiesapplication.xml【Maven项目中怎么导入jstl Maven项目中resources配置总结】编译后,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=mysqlapplication.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项目中怎么导入jstl Maven项目中resources配置总结

文章插图