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

mic*_*has 3 java gradle java-9 java-module

我使用gradle和jigsaw插件构建了一个小型(hello world style)java 9项目.

对于junit测试,我尝试访问某个文件作为资源,但classLoader.getResource(filename)无法找到该文件.

通常你把文件作为src/test/resources/foo.txt并将其作为访问它/foo.txt,但是对于Java 9,它看起来像是变化了,资源(类似于类)封装在模块中.

我在哪里准备好将gradle资源文件正确打包?

之后在测试中访问该文件的正确方法是什么?

我忘记阅读的文件是什么?:)


更确切地说,我建立了一个小型测试项目.更改到该目录后使用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
Run Code Online (Sandbox Code Playgroud)

我试图访问资源使用this.getClass().getResource("/resourceTest/test.txt"),不幸的是,null作为回报.

VGR*_*VGR 5

这似乎是一个Gradle错误.

当我使用该-i选项运行Gradle时,我看到它正在执行以运行程序的实际命令包括:

--patch-module resourceTest=/home/vgr/src/java_9_resource_test/build/classes/java/test
Run Code Online (Sandbox Code Playgroud)

如您所见,它包括build/classes目录,但不包括build/resources目录.

由于构建将类和资源放在不同的位置,因此无法使用--patch-module.类和资源必须在一个文件树或一个.jar文件中.

无论这是org.gradle.java.experimental-jigsaw插件中的缺陷,还是Gradle本身,我都不确定.