最近在学Mybatis,按照视频的讲解在项目的某个包里建立配置文件,然后读取配置文件,但是一直提示异常。
读取配置文件的为官方代码:
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
经过反复思考,视频用的ide是eclipse,eclipse里在包下的配置文件(.propoties 和.xml等)编译之后会自动复制到编译后的文件夹中,也就是classes目录。因此代码可以通过路径加载到配置文件。
而现在我们使用的是IntelliJ IDEA,idea对这些配置的文件方式很明显和eclipse是不同的。在idea中有一个 Content Roots的概念。需要为每一个folder配置相应的Content Roots。Content Roots包括resources、sources、tests等。
如图所示:
- java文件夹被标注为Sources,那么下面的所有子文件夹均为Sources,编译后生成.class文件。
- Resources文件夹被标注为Resources,那么在该文件夹下的配置文件在编译时会自动复制到编译文件夹中。
那么对于idea来说,就有以下几种解决方案。
- 将配置文件放到Resources文件夹中,在代码中添加配置文件的虚拟路径。选中文件,右键-Copy Reference,就可以获取到文件的虚拟路径。
- 把配置文件放在com.zjut.ssm.config包中,修改config文件夹的Content Roots为Resources,那么编译后,代码也能识别出来。
以上两种解决方案适用于make project方式来编译项目。
如果是maven项目。还可以通过配置pom.xml来实现。
<build>
<finalName>springmvc-study</finalName>
<resources>
<resource>
<directory>${basedir}/src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
这样不用对idea设置,也可以使用maven的编译命令编译项目,并复制配置文件到编译好的文件夹中。
- 那么问题是, 难道intellij必须以这种分开的方式来管理源码和资源文件嘛? 并不是的, intellij也可以像eclipse那样把source 和resource搅成一锅粥,下边来介绍怎么搞
- 这里需要注意一下,Intellij IDEA Version 2016.2.5 是有bug的, 有的时候, source下的资源文件是可以复制到目标文件夹的, 有的时候, 会被无视掉. 本文解决的问题就是, 当你的intellij不再帮你复制资源文件的时候, 你如何通过操作来让intellij自动帮你将资源文件拷贝到输出文件夹
- 我直接从朋友服务器上checkout一个项目
- 对这个项目做一些该做的配置, 比如输出文件夹啊, 库的位置啊, 还有部署一下tomcat啊
- 点运行之后, 可以看到, classes文件可以成功编译过来, 但是配置文件是过不来的
- 可以这样解决
- 之后到setting里边做如下的设置--这两步就能完全解决问题
首先打开setting 的build --> Compiler --> 把!?*.java 里边的?给删了 变成!*.java
下边打上勾
- 配置文件就都可以过来了