我昨晚(直到凌晨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.class
之间 getResource()
来自非静态上下文的
this.getClass()
而不是Resource.class
答案 0 :(得分:0)
我认为这应该有所帮助: 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在帖子中提供。