如何使用Java 9模块中的资源

时间:2018-04-05 17:37:53

标签: java gradle java-9 java-module

我使用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

1 个答案:

答案 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本身的缺陷,我不确定。