我使用gradle和jigsaw plugin构建了一个小型(hello world style)java 9项目。
对于junit测试,我尝试将某个文件作为资源访问,但classLoader.getResource(filename)
无法找到该文件。
通常您将文件设置为src/test/resources/foo.txt
并将其作为/foo.txt
访问,但使用Java 9时,事情看起来会发生变化,而资源(类似于类)encapsulated in modules。
我究竟需要将gradle的资源文件正确打包?
之后在测试中访问该文件的正确方法是什么?
我忘记阅读的文件是什么? :)
更准确地说,我设置了一个小test project。
使用git clone https://github.com/michas2/java_9_resource_test.git
并在更改到该目录后再执行gradle build
。 (我使用gradle 4.6,但这应该不是问题。)
结构如下:
.
├── build.gradle
└── src
├── main
│ └── java
│ ├── module-info.java
│ └── resourceTest
│ └── Main.java
└── test
├── java
│ └── resourceTest
│ └── MainTest.java
└── resources
└── resourceTest
└── test.txt
我尝试使用this.getClass().getResource("/resourceTest/test.txt")
来访问该资源,遗憾的是,该资源会返回null
。
答案 0 :(得分:5)
这似乎是一个Gradle错误。
当我使用-i
选项运行Gradle时,我看到它正在执行以运行程序的实际命令包括:
--patch-module resourceTest=/home/vgr/src/java_9_resource_test/build/classes/java/test
如您所见,它包括build/classes
目录,但不包括build/resources
目录。
由于构建将类和资源放在不同的位置,因此无法使用--patch-module
。类和资源必须在一个文件树或一个.jar文件中。
这是org.gradle.java.experimental-jigsaw插件或Gradle本身的缺陷,我不确定。