Maven项目中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配置总结的文章就介绍到这了,更多相关Maven resources配置内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Maven项目读取resources文件路径问题解决方案

    读取resources下文件的方法 网上有问答如下: 问: new FileInputStream("src/main/resources/all.properties") new FileInputStream("./src/main/resources/all.properties") 上面两个无法读取maven下资源文件目录下的文件嘛,总是提示找不到该路径,这么写错了嘛,但是我的其他maven可以读取 答: 要取编译后的路径,而不是你看到的src/main/r

  • Maven项目中读取src/main/resources目录下的配置文件的方法

    在Maven项目的开发中,当需要读取src/下的配置文件时,该怎么做? 我们假设Resources下有一个文件名为kafka.properties的配置文件(为什么用kafka.properties,因为这是在做kafka项目的时候碰到的问题,在网上查到了不少信息,索性当个搬运工,再根据自己的理解整理一下) 1.在java类中读取 若配置文件不在src/main/resources目录下,可以直接使用 Properties prop = new properties(); prop.load(n

  • Maven项目中resources配置总结

    背景 通常Maven项目的文件目录结构如下: # Maven项目的标准目录结构 src main java #源文件 resources #资源文件 filters #资源过滤文件 config #配置文件 scripts #脚本文件 webapp #web应用文件 test java #测试源文件 resources #测试资源文件 filters #测试资源过滤文件 it #集成测试 assembly #assembly descriptors site #Site target gener

  • IDEA将Maven项目中指定文件夹下的xml等文件编译进classes的方法

    出处:https://www.cnblogs.com/SunSpring eclipse下面创建的Maven项目,使用mybatis.eclipse里面能正常启动,在idea中一直卡在maybatis 加载位置. 1.首先是不报错也没反应.这个时候需要我们重写SqlSessionFactoryBean 让错误显示出来. public class BeanFactory extends SqlSessionFactoryBean { @Override protected SqlSessionFa

  • 浅谈Maven 项目中依赖的搜索顺序

    网上有很多关于maven项目中mirror.profile.repository的搜索顺序的文章,说法不一.官方文档并没有找到相关的说明,鉴于此,我抽时间做了一个验证. 依赖仓库的配置方式 maven项目使用的仓库一共有如下几种方式: 中央仓库,这是默认的仓库 镜像仓库,通过 sttings.xml 中的 settings.mirrors.mirror 配置 全局profile仓库,通过 settings.xml 中的 settings.repositories.repository 配置 项目

  • 在IDEA的maven项目中连接并使用MySQL8.0的方法教程

    首先看一下我的基本的开发环境: 操作系统:MacOS 10.13.5编辑器:IDEA 2018.3其他:MySQL8.0.15.Maven 3.3.9.JDK 1.8 好,下面就正式开始: 第一步:在IDEA中新建一个maven项目 1.使用骨架创建maven项目,此处选择:maven-archetype-quickstart 2.填入GroupId和ArtifactId 3.第一个选中maven安装的文件夹,第二个选中maven安装文件夹中的conf/settings.xml,第三个如果set

  • Intellij IDEA中如何查看maven项目中所有jar包的依赖关系图

    Maven 组件界面介绍 如上图标注 1 所示,为常用的 Maven 工具栏,其中最常用的有: 第一个按钮:Reimport All Maven Projects 表示根据 pom.xml 重新载入项目.一般单我们在 pom.xml 添加了依赖包或是插件的时候,发现标注 4 的依赖区中没有看到最新写的依赖的话,可以尝试点击此按钮进行项目的重新载入. 第六个按钮:Execute Maven Goal 弹出可执行的 Maven 命令的输入框.有些情况下我们需要通过书写某些执行命令来构建项目,就可以通

  • idea2019导入maven项目中的某些问题及解决方法

    idea2019导入maven项目中的某些问题 idea2019导入maven项目,会出现很多莫名其妙的问题,需要注意的是如果是idea2019的版本是3月以前的,那会maven需要下载3.6.1以前版本,3.6.2版本不兼容 需要3.6.1版本的童鞋可在官网下载,或者用下面链接获取: 链接: https://pan.baidu.com/s/1nkJNF1OUuzHxgsBHXa5gow 提取码: snk3 配置maven的setting.xml文件 如果导入依赖出现问题时,可从以下几方面查看:

  • 如何在Maven项目中运行JUnit5测试用例实现

    本文演示了如何如何编写JUnit 5测试用例,在Maven项目中运行JUnit 5测试用例. 编写JUnit 5测试用例 如果你是Java开发者,那么对于JUnit应该就不陌生.JUnit是Java单元测试的基础工具. JUnit目前最新的版本是JUnit 5.x,但广大的Java开发者估计还停留在JUnit 4.x,因此有必要演示下如何编写JUnit 5测试用例. 引入JUnit 5依赖 相比较JUnit 4而言,JUnit 5一个比较大的改变是JUnit 5拥有与JUnit 4不同的全新的A

  • 解决IDEA的maven项目中没有新建Servlet文件的选项问题

    问题:右键package新建却没有servlet的选项 原因:项目设置里面没有勾选Source Roots 解决办法: Step1. Step2 到此这篇关于IDEA的maven项目中没有新建Servlet文件的选项问题及解决方法的文章就介绍到这了,更多相关IDEA maven项目没有新建Servlet文件的选项内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

  • 解决Maven项目中 Invalid bound statement 无效的绑定问题

    问题 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 关于这个问题,我的是 Maven 项目,在访问程序的接口时,抛出异常信息,无效的绑定语句. 在检查调用的 Mapper 接口时,发现在目标文件中没有找到 Mapper 映射的配置文件,在项目的 target 目标文件中可以看到,与接口对应的 Mapper 文件未加载,所以在程序启动时,就找不到对应的映射文件,导致的这个错误. 解决

随机推荐