我正在研究Java项目,但有一个小问题。
我的项目当前可运行,并且当我从IntelliJ启动他时可以正常运行。要工作,他需要一些资源,例如图像或.txt文件。
这是我当前的文件 configuration
我的问题是:
当我将项目导出到可执行jar文件中时,他不起作用。 原因是他找不到资源。
但是,我用过Class.class.getResourcesAsStream(String)
。
最奇怪的是,资源在罐子中,并且正确放置...
任何人都可以帮助我们吗?
感谢您的帮助。
我的代码
File f = new File(Loader.class.getResource("/xsbfiles").getFile());
System.out.println(f.getAbsolutePath() +": exists ? " + f.exists());
System.out.println(f.getAbsolutePath());
从Intellij启动应用程序
/Users/gael/IdeaProjects/Sockoban/out/production/Sokoban/xsbfiles: exists ? true
/Users/gael/IdeaProjects/Sockoban/out/production/Sokoban/xsbfiles
Opening /Users/gael/IdeaProjects/Sockoban/out/production/Sokoban/xsbfiles/MicroCosmos.txt
Successful Opening
从终端启动jar文件
/Users/gael/IdeaProjects/Sockoban/out/artifacts/Sokoban/file:/Users/gael/IdeaProjects/Sockoban/out/artifacts/Sokoban/Sokoban.jar!/xsbfiles: exists ? false
/Users/gael/IdeaProjects/Sockoban/out/artifacts/Sokoban/file:/Users/gael/IdeaProjects/Sockoban/out/artifacts/Sokoban/Sokoban.jar!/xsbfiles
No xsbfile found
编辑:
最后,如示例所示,我已经使用BufferedReader解决了我的问题:
BufferedReader reader = new BufferedReader(
new InputStreamReader(MyClass.class.getResourceAsStream("/xsbfiles/MicroCosmos.txt")));
这是加载一个文件的好方法。但是,我需要读取名为xsbfiles ...
的文件夹中的所有文件。我搜索了不同的来源并发现了a similar question。
一个答案建议使用“ hack”列出文件夹中包含的文件。 这是蜘蛛侠鲍里斯(Boris)的代码示例:
public static List<URL> getResources(final String path) throws IOException {
final ClassLoader loader = Thread.currentThread().getContextClassLoader();
try (
final InputStream is = loader.getResourceAsStream(path);
final InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
final BufferedReader br = new BufferedReader(isr)) {
return br.lines()
.map(l -> path + "/" + l)
.map(r -> loader.getResource(r))
.collect(toList());
}
}
为了很好地理解代码,我已经在IDE和终端中运行了他。 似乎可以在我的IDE上正确运行,但不能与jar一起运行。
我怎么办那不起作用?