【问题标题】:FileNotFoundException with getResourceAsStream() in JAR fileJAR 文件中带有 getResourceAsStream() 的 FileNotFoundException
【发布时间】:2018-03-19 21:18:39
【问题描述】:

我不知道该怎么办了。尝试从可运行的 .jar 文件执行我的程序时,我在尝试使用 getResourceAsStream() 读取我的 .properties 文件时收到 FileNotFoundException。

我使用 Maven 3.5.0 和 Java 8 Update 144,Eclipse Oxygen。 我还使用 maven-assembly-plugin 和 assembly descriptor jar-with-dependencies 来生成我的单个 .jar 文件。

属性文件位于 /src/main/resources(在 Eclipse 中),因为它是 Maven 的约定。然后 - 在构建 .jar 文件时 - 自动放入 .jar 文件的根目录中。

在 Eclipse 中运行程序时完美运行。我只是为 getResourceAsStream() 方法提供属性文件的名称,而不是其他斜杠 (/) 或任何内容。我查看了 .jar 文件,发现该文件直接位于 .jar 文件的根目录中。

为什么找不到 .properties 文件?我就是不明白。

2017 年 10 月 12 日更新

我发布了一个答案并认为它会起作用,但它似乎起作用了,因为我更改了版本字符串并附加了一个“-SNAPSHOT”,但从那时起,我的子模块没有得到更新。 我知道我只需要附加文字“-SNAPSHOT”,以便 Maven 重新编译我在 Eclipse 中更改的当前代码并将其放入我的 .jar 文件中。但事实并非如此。

Maven 开始让我很恼火。它应该像这样工作。现在到底出了什么问题?

顺便说一句,应该强制更新的“mvn clean -U package”也不会更新快照。我使用 maven 程序集插件。

【问题讨论】:

    标签: java maven jar


    【解决方案1】:

    您需要在路径的开头添加一个斜杠。

    this.getResourceAsStream('/myFile.properties')
    

    【讨论】:

    • 不,这也不起作用。只需一个斜线“/”,它甚至不再在 Eclipse 中工作。那么它必须是一个“./”。但是这两种方法在 .jar 中都不起作用。
    • 我刚刚意识到(通过远程调试 .jar 文件)由于某种奇怪的原因,编译的程序集没有编译依赖项的当前状态。我有一个多模块项目,有一个服务器和一个客户端模块,还有一个共享模块,其中包含服务器和客户端的类。并且由于某种原因,共享项目(模块)没有被编译 - 连同服务器 - 以一种与我在 Eclipse 中看到的当前状态同步的方式。这导致我有一个“./MyPropertiesFile.config”路径而不是“MyPropertiesFile.config”路径。
    • 我现在需要找出为什么这里显示的 jar-with-dependencies 描述符不能正常工作(太烦人了)。
    【解决方案2】:

    找到了解决办法。我没有在 Maven 中使用 SNAPSHOT 构建。结果我需要为标签使用“[version-number]-SNAPSHOT”,以便 Maven 始终使用当前最新的代码进行构建。 现在它起作用了。 :)

    2017 年 10 月 12 日更新

    好的,我想我知道出了什么问题。我需要从我的父目录运行“mvn install”,以便调用子模块 A 的编译和安装,子模块 B 将其作为依赖项引用。然后我可以在子模块 B 上运行“mvn package”,以便将子模块 A 的最新代码内置到单个 .jar 文件中。 :) 终于……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 2011-12-04
      相关资源
      最近更新 更多