Java Jar资源访问中的IllegalArgumentException
我花了整个晚上(直到凌晨3点)和今天早上研究、测试、重构,并试图调试这个问题。我在Netbeans中有一个简单的Java游戏,虽然它在IDE中以运行或调试模式完美运行,但一旦导出到Java Jar资源访问中的IllegalArgumentException,java,netbeans,jar,resources,Java,Netbeans,Jar,Resources,我花了整个晚上(直到凌晨3点)和今天早上研究、测试、重构,并试图调试这个问题。我在Netbeans中有一个简单的Java游戏,虽然它在IDE中以运行或调试模式完美运行,但一旦导出到jar文件中,它就拒绝正确加载任何资源。有许多类似的问题,例如,尽管付出了巨大的努力,但这些解决方案都不适用于我的项目。我不使用图像图标,只使用简单的缓冲图像和wav声音文件。我最近进行了重构,将我的BufferedImageLoader和Sound类合并到一个资源类中,然后将其与我的所有资源移到同一个包中,尽管它在I
jar
文件中,它就拒绝正确加载任何资源。有许多类似的问题,例如,尽管付出了巨大的努力,但这些解决方案都不适用于我的项目。我不使用图像图标,只使用简单的缓冲图像和wav
声音文件。我最近进行了重构,将我的BufferedImageLoader和Sound类合并到一个资源类中,然后将其与我的所有资源移到同一个包中,尽管它在IDE中之前在单独的代码包中工作得非常好,尽管它也在其新位置工作,严格地说是在IDE中
我对这个问题感到相当恼火和慌乱。真正令人恼火的是,这个项目在被导出到jar
之后,曾经使用过资源,现在它似乎已经停止工作,没有任何更改。在编程上,它工作的时候和现在唯一的区别是,我当时没有或没有使用声音文件,但这个错误与声音文件无关,因为它捕获了一个异常(并生成了一个错误对话框),只是从第一次尝试加载艺术资产开始
我已经尝试了我在研究中发现的所有可能的解决方案,但都无济于事。希望一双新的眼睛能揭示我的错误
有问题的代码行是
return ImageIO.read(Resource.class.getResource("/res/" + imageFileName));
而imageFileName是具有从方法调用传递的值的参数,例如
blockSheet = Resource.loadImage("art_assets/platform.png");
资源类的位置似乎与Netbeans中的工作无关。我的res
文件夹位于src
内,紧挨着com
类包开头
它抛出一个IllegalArgumentException:input==null代码>异常。经过一些测试,似乎Resource.class.getResource(“/res/”+imageFileName)
返回一个空值,这毫无意义。同样,这在IDE中工作得非常完美。我可以将jar
文件更改为zip
,并查看内部,以确保所有资源都具有正确的名称和正确的扩展名
非常感谢您的帮助。多谢各位
编辑:
我已经尝试过的一些事情:
getResourceAsStream()
而不是getResource()
classLoader()
在Resource.class
和getResource()之间
this.getClass()
而不是非静态上下文中的Resource.class
,我认为这应该有帮助:
由本尼·纽格鲍尔在邮报上提供
CodeSource codeSource = YourMainClass.class.getProtectionDomain().getCodeSource();
File jarFile = new File(codeSource.getLocation().toURI().getPath());
String jarDir = jarFile.getParentFile().getPath();