今天在写代码时,出现了在IDEA可以运行单元测试,但是通过mvn test
却找不到测试文件的奇怪情况。所以对IDEA的目录结构配置以及maven的目录结构配置做一个总结
maven项目默认目录
src/main/java
:项目源代码目录src/main/resources
:项目资源目录src/test/java
:测试源代码目录src/test/resources
:测试资源目录target/classes
:项目源代码编译文件目录(项目资源目录里的文件也会复制到这里)target/surefire-reports
:测试结果的报告target/test-classes
:测试源代码编译文件目录(测试资源目录里的文件也会复制到这里)
maven项目目录设置
<build>
<!-- 项目源代码目录 -->
<sourceDirectory>src/main/java</sourceDirectory>
<!-- 测试源代码目录 -->
<testSourceDirectory>src/test/java</testSourceDirectory>
<!-- 项目源代码编译目录 -->
<outputDirectory>target/classes</outputDirectory>
<!-- 测试源代码编译目录 -->
<testOutputDirectory>target/test-classes</testOutputDirectory>
<!-- 项目资源目录 -->
<resources>
<resource>
<directory>src/main/resource</directory>
</resource>
</resources>
<!-- 测试资源目录 -->
<testResources>
<testResource>
<directory>src/test/resource</directory>
</testResource>
</testResources>
</build>
IDEA Content roots
IDEA的Content roots是项目中源代码,脚本,单元测试等文件的集合,通过Content roots下不同类型的目录来分类
source
:项目源代码,使用IDEA编译时,效果等同于maven里的src/main/java
resource
:项目资源文件,使用IDEA编译时,效果等同于maven里的src/main/resources
test resource
:测试源代码,使用IDEA编译时,效果等同于maven里的src/test/java
tests
:测试资源文件,使用IDEA编译时,效果等同于maven里的src/test/resources
exclude
:应该被忽略的文件,如缓存或者编译产生文件,图中的target被标记成了exclude
IDEA的目录设置与pom.xml的目录设置不是相关联的
获取资源文件
Class.class.getResource(String path)
- path不以
/
开头时,从此类的源文件同级目录下取资源; path以
/
开头时,则是从classpath根目录下获取;- 若为测试类(类源文件处在测试源代码目录里),相对路径在
target/test-classes/
下(测试资源文件目录里的文件也会拷贝到其中) - 若不为为测试类(类源文件处在项目源代码目录里),相对路径在
target/classes/
下(项目资源文件目录里的文件也会拷贝到其中)
总结
在IDEA中,相对路径默认为项目根目录。IDEA的目录设置与pom.xml的目录设置不是相关联的,同一个目录可以在pom.xml中标记为testResources
,却在IDEA标记为resource
。另外,IDEA标记目录的属性文件保存在.idea
里。所以在实际开发中,应该让两者的标记相同。
文档信息
- 本文作者:wzx
- 本文链接:https://masterwangzx.com/2019/07/05/maven-path/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)