【问题标题】:Java loading of resources fails when running executable maven jar file: unable to resolve "file:/...."运行可执行 maven jar 文件时,Java 加载资源失败:无法解析“file:/....”
【发布时间】:2014-01-17 16:05:42
【问题描述】:

我的问题是,当我使用 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, loading of resources fails: unable to resolve file:/my-jar.jar!/folder/my-file。他们声明他们必须具有文件的路径才能放入属性文件。我也需要文件的路径,并且无法将资源作为流检索。我需要该路径才能将该路径添加到属性文件,然后由外部库读取。

【问题讨论】:

标签: java eclipse maven resources


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    天哪!

    我昨天遇到了同样/类似的问题;并在一天的大部分时间里挠了挠我的(光头)头,以了解为什么在 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: *******************************************************
    

    今天,我发现从可执行 JAR 访问资源文件的路径是区分大小写的——即使在 Windows 系统上也是如此。

    我原来的资源路径是:

    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);
    

    【讨论】:

      猜你喜欢
      • 2014-01-11
      • 2015-08-03
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多