繁体   English   中英

运行可执行maven jar文件时Java加载资源失败:无法解析“file:/...”

[英]Java loading of resources fails when running executable maven jar file: unable to resolve “file:/…”

我的问题是,当我使用 maven(使用 shade 插件)构建一个可执行 jar 并尝试运行该 jar 时,我收到一个错误:

java.io.IOException: Unable to resolve "file:/C:/Users/name/Desktop/nameofjar-SNAPSHOT.jar!/path/to/file.gz

当我在 eclipse 中运行主程序时,GUI 正确加载了资源文件。 我打印了文件目录的输出:

Loading parser from serialized file /C:/Users/name/git/guis/target/classes/path/to/file.gz

IOException 发生在这行代码处:

URL url = SentenceParser.class.getResource("file.gz");
props.setProperty("file", url.getPath());

file.gz 位于 src/main/resources/path/to/file.gz 中,类定义在 src/main/java/path/to 的 java src 目录中。

经过研究,我的问题几乎和这个人的问题一模一样: java,加载资源失败:无法解析 file:/my-jar.jar!/folder/my-file 他们声明他们必须有文件的路径才能放入属性文件。 我也需要文件的路径,不能以流的形式检索资源。 我需要路径以便将该路径添加到属性文件,然后由外部库读取。

如果您的应用程序中的其他 jar 文件需要读入和操作它,那么最好将您的文件放在 jar 文件的外部。 像这样:

文件.gz
我的jar文件
myjar2.jar

这样您就可以使用以下代码获取公共资源文件的绝对路径:

static final String WORKINGDIR = System.getProperty("user.dir");
static final String SEPARATOR = System.getProperty("file.separator");
String path =  WORKINGDIR + SEPARATOR + "file.gz";
URL url = SentenceParser.class.getResource(path);

试试这个,看看它是否有效。

问题是,当您直接从 Eclipse 中运行应用程序时,应用程序本身并不在 jar 中。 您只是在运行未打包的类文件。 因此,它可以很好地找到资源文件。 但是,当您 jar 应用程序并运行它时,资源文件驻留在 jar 中,应用程序很难找到它。 如果您将资源文件保存在 jar 外部,则使用我上面提供的代码更容易找到它们。 无论如何,我发现这最适合我。

好家伙!

我昨天遇到了相同/类似的问题; 并在一天的大部分时间里挠了挠我的(秃头)头,以了解为什么可以在 Eclipse 中访问资源文件夹中的文件 - 但不能通过可执行 JAR 访问。

Reading project properties....
Jul 14, 2021 2:03:12 PM main.helper.CALotteryLogger logAbort
SEVERE: *******************************************************
Jul 14, 2021 2:03:12 PM main.helper.CALotteryLogger logAbort
SEVERE: * Alert:          InputStream for main/Resources/Common config With IDs.properties is NULL.
Jul 14, 2021 2:03:12 PM main.helper.CALotteryLogger logAbort
SEVERE: *******************************************************

今天,我发现资源文件的路径是区分大小写的——即使在 Windows 系统上——当涉及到从可执行 JAR 访问它时。

我原来的资源路径是:

private static final String CONFIG_PROPERTIES_FILEPATH = "main/Resources/Common config With IDs.properties";

这导致了失败。 但是当我把它改成

private static final String CONFIG_PROPERTIES_FILEPATH = "main/resources/Common config With IDs.properties";

问题解决了。

请注意,文件名中的“Resources”已更改为“resources”以解决该问题。

通常,Windows 不区分大小写,但对于可执行 JAR 文件则不然。 学过的知识!!

PS:以下语法用于打开资源文件:

InputStream is = ReadConfigData.class.getClassLoader().getResourceAsStream(CONFIG_PROPERTIES_FILEPATH);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM