【问题标题】:IllegalArgumentException at Java Jar resource accessJava Jar 资源访问时的 IllegalArgumentException
【发布时间】:2016-02-16 21:56:06
【问题描述】:

我昨晚(直到凌晨 3 点)和今天早上都在研究、测试、重构和尝试调试这个问题。我在 Netbeans 中有一个简单的 Java 游戏,虽然它在 IDE 中以运行或调试模式完美运行,但一旦导出到 jar 文件中,它就会拒绝正确加载任何资源。有许多类似的问题,例如this one regarding loading an ImageIcon,尽管付出了很大努力,但这些解决方案都不适用于我的项目。我没有使用 ImageIcons,只使用简单的 BufferedImages 和 wav 声音文件。我最近进行了重构,将我的 BufferedImageLoader 和 Sound 类合并到一个 Resource 类中,然后我将它移到与我的所有资源相同的包中,尽管它之前在 IDE 中的单独代码包中运行良好,尽管它在其新位置工作同样,严格在 IDE 内。

我对这个问题感到非常恼火和慌乱。真正令人气愤的是,这个项目曾经在导出到jar 后使用资源,现在它似乎已经停止工作,没有任何变化。它工作时和现在之间唯一真正的编程区别是我当时没有或没有使用声音文件,但这个错误与声音文件无关,因为它捕获了一个异常(并生成一个错误对话框)刚开始尝试加载艺术资产。

我已经尝试了我在研究中找到的所有可能的解决方案,但均无济于事。希望有一双新的眼睛能揭露我的错误。

有问题的代码行是

return ImageIO.read(Resource.class.getResource("/res/" + imageFileName));

而 imageFileName 是具有从方法调用传递的值的参数,例如

blockSheet = Resource.loadImage("art_assets/platform.png");

Resource 类的位置似乎与 Netbeans 中的这项工作无关。我的res 文件夹在src 内,在com 类包开头的旁边。

它会抛出一个IllegalArgumentException: input == null! 异常。经过一些测试,Resource.class.getResource("/res/" + imageFileName) 似乎返回了一个空值,这根本没有意义。同样,这在 IDE 中非常完美。我可以将 jar 文件更改为 zip 并查看内部以查看所有资源都在它们应该位于的位置,并具有正确的名称和正确的扩展名。

Here is a zip file of my entire project. 非常感谢任何帮助。谢谢。

编辑:

我已经尝试过的一些事情:

getResourceAsStream() 而不是getResource()

classLoader()Resource.classgetResource() 之间

this.getClass() 而不是来自非静态上下文的Resource.class

【问题讨论】:

    标签: java netbeans jar resources


    【解决方案1】:

    我认为这应该会有所帮助: How to get the path of a running JAR file?

    CodeSource codeSource = YourMainClass.class.getProtectionDomain().getCodeSource(); 
    File jarFile = new File(codeSource.getLocation().toURI().getPath());
    String jarDir = jarFile.getParentFile().getPath();
    

    由 Benny Neugebauer 在帖子中提供。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-27
      • 2011-02-08
      • 2016-12-29
      • 2012-11-28
      • 2012-05-11
      • 2020-01-31
      • 2011-01-28
      相关资源
      最近更新 更多