我的问题是,当我使用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。他们声明他们必须拥有文件的路径才能放入属性文件。我也需要文件的路径,不能以流的形式检索资源。我需要路径才能将该路径添加到属性文件中,然后由外部库读取。
答案 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);