gpt4 book ai didi

java - 使用 maven 构建的可执行 JAR 从静态方法加载时无法找到资源

转载 作者:行者123 更新时间:2023-12-02 02:14:47 27 4
gpt4 key购买 nike

所以我有一个小型资源加载器来存放我需要的东西。 jar 打包了资源,但是当我构建 maven 项目时,所有依赖项工作和资源文件夹都被标记为资源,我的图像和脚本将无法加载。

这是我正在使用的代码:

...

public class ResourceLoader
{
public static ImageIcon getImageIconResource(String fileName) {
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
File file = new File(classLoader.getResource("img/" + fileName).getFile());
return new ImageIcon(file.getPath());
}

public static File getScriptResource(String fileName) {
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
return new File(classLoader.getResource("scripts/" + fileName).getFile());
}
}

最佳答案

问题不在于maven本身。当你打电话时

File.getPath

资源中的文件指向一个文件,该文件实际上位于应用程序存档的内部。对于大多数应用程序来说,这会带来问题,因为在不解压存档的情况下无法读取文件。要正确使用资源文件,您必须使用 File,或者您可以调用

ClassLoader.getResourcesAsStream

地址ImageIcon

public static ImageIcon getImageIconResource(String fileName) {
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
InputStream is = classLoader.getResourceAsStream("img/" + fileName);
Image image = ImageIO.read(is);
return new ImageIcon(image);
}

至于获取 File 对象的 getScriptResource 方法应该可以工作。但这取决于您以后如何使用它。因为我认为您无论如何都需要在某些时候阅读它,所以我建议也使用输入流。

public static InpoutStream getScriptResource(String fileName) {
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
InputStream is = classLoader.getResourceAsStream("scripts/" + fileName);
return is;
}

然后,您可以使用许多适合您需要的选项来读取InputStream。例如,您可以查看 Apache Commons' IoUtils或使用 ReaderApi 处理它

编辑:

因为您已经阐明了如何使用您的文件,所以我可以看到您的脚本的问题出在哪里。您正在启动应用程序之外的另一个流程。在 python3 的第一个 CLI 参数中,您提供文件的路径。正如我之前写的 - 这就是问题所在,因为 python3 无法读取 .jar 文件内的文件。首先,我会质疑你的架构。您真的需要在 .jar 中包含脚本吗?

无论如何,一种可能的解决方法是将脚本文件的内容存储在临时文件中。

File tempFile = File.createTempFile("prefix-", "-suffix");
// e.g.: File tempFile = File.createTempFile("MyAppName-", ".tmp");
tempFile.deleteOnExit();
//get your script and prepare OutputStream to tempFile
// Try with resources, because you want to close your streams
try (InputStream is = ResourceLoader.getScriptResource(scriptName);
FileOutputStream out = new FileOutputStream(tempFile)) {
//NOTE: You can use any method to copy InputStream to OutputStream.
//Here I have used Apache IO Utils
IOUtils.copy(is, out);
}
boolean success = executePythonScriptWithArgs(tempFile, args);

关于java - 使用 maven 构建的可执行 JAR 从静态方法加载时无法找到资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49466661/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com