当我有以下代码尝试访问资源时:
foo / Main.java
package foo;
import java.io.*;
public class Main{
public static void main(String... args) throws IOException{
try(BufferedReader in = new BufferedReader(new InputStreamReader(
Main.class.getClassLoader().getResourceAsStream("foo/res.txt")))){
for(String line = in.readLine(); line!=null; line=in.readLine()){
System.out.println("Line : " + line);
}
System.out.println("EOF");
}
}
}
编译:
javac foo/Main.java -d build/classes/
并添加一些资源文件,然后我将得到如下内容:
foo/
|--Main.java
`--build
|--classes
| `--foo
| `--Main.class
`--resources
`--foo
`--res.txt
并通过执行以下命令运行后:
java -cp "build/classes:build/resources" foo.Main
我将获得预期的输出,例如:
Line : This is a
Line : test!
EOF
但是当我使项目模块化时会出现问题。我像这样添加了最简单的module-info.java:
module-info.java
module bar {
}
并进行编译:
javac foo/Main.java module-info.java -d build/classes/
然后我将获得以下文件结构:
module-info.java
foo/
|--Main.java
`--build
|--classes
| |--module-info.class
| `--foo
| `--Main.class
`--resources
`--foo
`--res.txt
但是当我通过输入命令
执行该类时java -p "build/classes/;build/resources/" -m bar/foo.Main
我收到一条错误消息,声称找不到资源。
Exception in thread "main" java.lang.NullPointerException
at java.base/java.io.Reader.<init>(Reader.java:167)
at java.base/java.io.InputStreamReader.<init>(InputStreamReader.java:72)
at bar/foo.Main.main(Main.java:7)
如何从模块内部访问资源?
编辑:注意,此问题专门询问如何访问“爆炸”模块(尚未打包为JAR文件的模块)中的资源。这里的关键细节是,在展开的模块中,除非按照@Alan Bateman的注释在命令行上专门修补,否则资源文件夹不会自动被视为模块的一部分。
这使问题不再是“ Java 9 jigsaw - accessing resource files from external modules”的重复。这个问题涉及将对资源文件的访问权限从一个未爆炸的模块授予另一个未爆炸的模块。
此问题也不是“ How to work with resources in Java 9 modules”的重复项。该问题涉及一种情况,其中一个“主”模块无法通过“ --add-patch”访问放置在其中的与测试相关的资源,这是由于Gradle不包含与测试相关的资源文件夹这一事实。
此问题也不是“ Java 9 Module system Resources files location”的重复项。这个问题涉及如何使模块访问模块自身的源代码树之外的资源文件夹。
该问题可能最接近其重复项的现有问题可能是“ Where do resource files go in a Gradle project that builds a Java 9 module?”,它详细涵盖了几个相关方案,如果您对此问题有疑问,则非常值得阅读