Maven 的配置文件路径读取方法

在使用 XML 的配置方式来构建 Mybatis 的核心类 SqlSessionFactory 时,遇到了配置文件路径总是写不对的问题。事后看其实就是没有好好看文档,一直在盲人摸象。

下面时读取 XML 配置文件的代码:

var inputSteam = Resources.getResourceAsStream("config/mybatis.xml");
var sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputSteam);

一开始我是将配置文件放在 src/main/java/com/imxfly/config/mybatis.xml 中,然后读取路径写成:com/imxfly/config/mybatis.xml ,但是提示 java.io.IOException: Could not find resource com/imxfly/config/mybatis.xml。

所以关键是这里的配置文件路径如何填写,我们知道读取的路径并不是按照当前开发时候的目录结构来的,而是编译后在项目 target 目录下以 classes 目录为 classpath(即类的根目录)去读取的。

假设我们把配置文件放在 src/main/java/com/imxfly/config 目录下,那么使用 maven compile 编译后去查看 target 目录你会发现找不到这个配置文件,这是因为 Maven 编译的时候默认只读取 src/main/java 目录下的 .java 文件然后编译成 .class 文件,所以你在 target 目录下是找不到我们的配置文件的,怎么解决呢?

推荐的做法是把这些 XML 配置文件放在 src/main/resources 目录下。

在官方文档(点击查看)中清楚的描述了这一行为,其中有一句话:

Within artifact producing source directories (ie. main and test), there is one directory for the language java (under which the normal package hierarchy exists), and one for resources (the structure which is copied to the target classpath given the default resource definition).

对于 resources 目录,其目录结构会完整的直接拷贝到 target classpath 中,假如我们有如下 src 的目录结构:

.
├── main
│  ├── java
│  │  └── com
│  │    └── imxfly
│  │      └── App.java
│  └── resources
│    └── config
│      └── mybatis.xml
└── test
  └── java
    └── com
      └── imxfly
        └── AppTest.java

那么编译完后的 target 目录结构就是:

.
├── classes
  ├── com
  │  └── imxfly
  │    └── App.class
  └── config
    └── mybatis.xml

所以我们在代码中读取配置文件的路径就是:

var inputSteam = Resources.getResourceAsStream("config/mybatis.xml");

因为默认情况下,Maven 会在 src/main/resources 去寻找项目的资源文件。

但是如果我们的项目结构不好修改,配置文件就在 src/main/java/com/imxfly/config/mybatis.xml 怎么办?

此时我们就需要在 Maven 配置文件 pom.xml 中去告诉 Maven 我们的资源文件放在了哪里:

<project>
 ...
 <build>
  ...
  <resources>
   <resource>
    <directory>src/main/java/com/imxfly/config</directory>
   </resource>
   <resource>
    <directory>src/main/java/com/imxfly/config2</directory>
   </resource>
   <resource>
    <directory>src/main/java/com/imxfly/config3</directory>
   </resource>
  </resources>
  ...
 </build>
 ...
</project>

编译时 Maven 就会把这些目录下的文件结构完整的拷贝到 target 目录下(就像上面完整拷贝 resources 目录一样),所以此时我们的读取路径为:

var inputSteam = Resources.getResourceAsStream("mybatis.xml");

参考资料:

https://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html
https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

到此这篇关于Maven 的配置文件路径读取方法的文章就介绍到这了,更多相关Maven 配置文件路径读取内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Maven根据不同环境打包不同配置文件的方法

    开发项目时会遇到这个问题:开发环境,测试环境,生产环境的配置文件不同,打包时经常要手动更改配置文件,更改的少还可以接受,但是如果需要更多个配置文件,手动的方法就显得非常笨重了. 下面介绍一种方法,利用Maven插件来打包不同环境的配置文件.我们用到的是maven-war-plugin这个插件. 首先贴出整个pom文件: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.

  • Maven配置文件pom.xml详解

    什么是POM? POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml.在Maven中,当谈到Project的时候,不仅仅是一堆包含代码的文件.一个Project往往包含一个配置文件,包括了与开发者有关的,缺陷跟踪系统,组织与许可,项目的URL,项目依赖,以及其他.它包含了所有与这个项目相关的东西.事实上,在Maven世界中,project可以什么都没有,甚至没有代码,但是必须包含pom.xml文件. 概览 下面

  • Maven中pom.xml配置文件详细介绍

    setting.xml主要用于配置maven的运行环境等一系列通用的属性,是全局级别的配置文件:而pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和licenses,以及其他所有的项目相关因素,是项目级别的配置文件. 基础配置 一个典型的pom.xml文件配置如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org

  • spring的maven配置文件整理

    spring maven配置文件整理 spring各个包的maven配置文件 <!--spring-context--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.2.RELEASE</version> </dependency> &

  • 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 profile动态选择配置文件详解

    一.背景 在开发过程中,我们的软件会面对不同的运行环境,比如开发环境.测试环境.生产环境,而我们的软件在不同的环境中,有的配置可能会不一样,比如数据源配置.日志文件配置.以及一些软件运行过程中的基本配置,那每次我们将软件部署到不同的环境时,都需要修改相应的配置文件,这样来回修改,很容易出错,而且浪费劳动力. maven提供了一种方便的解决这种问题的方案,就是profile功能. 二.profile简介 profile可以让我们定义一系列的配置信息,然后指定其激活条件.这样我们就可以定义多个pro

  • 使用maven profile指定配置文件打包适用多环境的方法

    开发过程, 我们习惯把数据源配置, 项目常量, 日志配置等基础数据配置写到一个个单独的的文件中. 如jdbc.properties等各种.格式的文件. 如何不频繁修改配置文件, 随时打包不同基础数据配置信息的项目. 1.新建maven项目,   在pom.xml中添加 profile节点信息如下: <profiles> <profile> <!-- 开发环境 --> <id>dev</id> <properties> <envi

  • Maven setting.xml配置文件详解

    maven的配置文件settings.xml存在于两个地方: 1.安装的地方:${M2_HOME}/conf/settings.xml 2.用户的目录:${user.home}/.m2/settings.xml 前者又被叫做全局配置,对操作系统的所有使用者生效:后者被称为用户配置,只对当前操作系统的使用者生效.如果两者都存在,它们的内容将被合并,并且用户范围的settings.xml会覆盖全局的settings.xml. Maven安装后,用户目录下不会自动生成settings.xml,只有全局

  • Maven 配置文件 生命周期 常用命令详解

    当前,JVM生态圈主要的三大构建工具: Apache Ant(带着Ivy) Maven Gradle 对于初学者,Ant是最清晰的,只要读懂Xml配置文件你就能够理解它干了什么,但是ant文件很容易变的更加复杂.Maven有自己的工程目录规则和内置的构建生成周期,从而使构建文件更加简单.gradle有很多开箱即用的插件,语法更加短小精悍,易于理解. 在讲解maven之前这里我们先简单比较下Maven和Ant.下面是一个简单的Ant例子.这个例子可以看出我们需要明确的告诉Ant.我们想让他做什么.

  • 详解maven的setting配置文件中mirror和repository的区别

    当maven需要到的依赖jar包不在本地仓库时, 就需要到远程仓库下载 . 这个时候如果mavensetting.xml中配置了镜像 , 而且镜像配置的规则中匹配到目标仓库时 , maven认为目标仓库被镜像了, 不会再去被镜像仓库下载依赖jar包, 而是直接去镜像仓库下载. 简单而言, mirror可以拦截对远程仓库的请求 , 改变对目标仓库的下载地址 repository repository就是个仓库. maven里有两种仓库,本地仓库和远程仓库. 远程仓库相当于公共的仓库,大家都能看到.

随机推荐