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

时间:2014-01-17 16:05:43

标签: java eclipse maven resources

我的问题是,当我使用maven构建一个可执行jar(使用shade插件)并尝试运行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, loading of resources fails: unable to resolve file:/my-jar.jar!/folder/my-file。他们声明他们必须拥有文件的路径才能放入属性文件。我也需要文件的路径,不能以流的形式检索资源。我需要路径才能将该路径添加到属性文件中,然后由外部库读取。

2 个答案:

答案 0 :(得分:0)

如果需要在应用程序中读取并操作其他jar文件,最好将文件放在jar文件的外部。像这样:

file.gz
myjar.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中。你只是运行类文件,unpackaged。因此,它可以很好地找到资源文件。但是当您对应用程序进行jar操作并运行它时,资源文件驻留在jar中,并且应用程序很难找到它。如果将资源文件保存在jar外部,则使用上面提供的代码更容易找到它们。无论如何,我觉得这对我来说最好。

答案 1 :(得分:0)

天哪!

我昨天遇到了相同/类似的问题;并在一天中的大部分时间里挠了挠我(秃头)的头,以了解为什么资源文件夹中的文件可以在 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 文件时则不然。吸取教训!!

P.S: 以下语法用于打开资源文件:

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