问题
I built a small (hello world style) java 9 project using gradle and the jigsaw plugin.
For a junit test I tried to access some file as a resource, but classLoader.getResource(filename) is not able to locate the file.
Usually you put the file as src/test/resources/foo.txt and access it as /foo.txt, but with Java 9 it looks like things changed and resources are (similar like classes) encapsulated in modules.
Where exactly do I have to put the resource file for gradle to package it correctly?
What is the right way to access that file afterwards in the test?
What is the documentation I forgot to read? :)
To be more precise I set up a small test project.
Use git clone https://github.com/michas2/java_9_resource_test.git and do a gradle build afterwards after changing to that directory. (I'm using gradle 4.6, but that should not be the problem.)
The structure looks like this:
.
├── build.gradle
└── src
├── main
│ └── java
│ ├── module-info.java
│ └── resourceTest
│ └── Main.java
└── test
├── java
│ └── resourceTest
│ └── MainTest.java
└── resources
└── resourceTest
└── test.txt
I try to access the resource using this.getClass().getResource("/resourceTest/test.txt"), which unfortunately gives null in return.
回答1:
This appears to be a Gradle bug.
When I run Gradle with the -i option, I see that the actual command it’s executing to run your program includes this:
--patch-module resourceTest=/home/vgr/src/java_9_resource_test/build/classes/java/test
As you can see, it’s including the build/classes directory, but not the build/resources directory.
Since the build places the classes and resources in separate places, there is no way to use --patch-module. The classes and resources must be together, in one file tree or one .jar file.
Whether this is a flaw in the org.gradle.java.experimental-jigsaw plugin, or Gradle itself, I’m not sure.
来源:https://stackoverflow.com/questions/49678324/how-to-work-with-resources-in-java-9-modules