问题说明
IDEA 确实是个折腾人的玩意,没想到在最基本的编译环节居然也能遇到问题。
此次配置一个单module 的项目,使用的是 gradle 导入项目,没想到发现编译之后允许某个单元测试的时候出错了,到 build 目录一看,感情是 resources 目录下的配置文件都没用拷贝过来,只有一堆的 class package。
Google 一圈发现这是 IDEA 的 bug,不过官方 issue 里面不愿意承认是 bug:
IDEA-128273 Resource folders drop out of junit test classpath after a while for Gradle based project
这个问题据说也牵连到了 Android Studio。
官方提供的解决办法
给出的解决办法是在 gradle 的 IDEA 配置中增加一行:
idea {
module {
inheritOutputDirs = true
}
}
也就是说默认采用项目的编译输出路径:
这时候还需要注意一点,尽量不要手贱(例如我),在这儿又设置了下项目名称:
idea {
module {
name = "XXOO"
inheritOutputDirs = true
}
}
这么搞的话输出又会出现问题了,奶奶的,IDEA 你还敢说这不是你们的 bug,起码是处理不严谨吧!!!
** :exclamation: 另外采用这种办法的话,需要删除项目下的 IDEA 相关配置文件,然后重新导入。**
民间智慧
在stackoverflow 发现的解决办法 是在 gradle 中多配置个 Task:
task copyTestResources(type: Copy) {
from "${projectDir}/src/test/resources"
into "${buildDir}/classes/test"
}
processTestResources.dependsOn copyTestResources
意思很简单,就是在处理 Test 资源的时候将这些 resources 下的文件拷贝到相应的 build 下。
不过这种方法有点麻烦,单项目比较简单,直接用就行了,但是如果是多 module 的话还得进行相应处理。
结论
这个无论如何我觉得都算是 IDEA 的bug 了,不过目前既然有了解决方案起码不算是太影响干活。
另外推荐采用官方提供的解决方案,相对来说省事,也能顺便解决多 module 的问题。