我知道此问题(或类似的问题)之前已被问过,但我仍然不理解。我创建了一个具有以下内部结构的jar:
JAR文件
-configuration
--- codeBehind
--- COMMANDLINE
--- GUI
---资源
在资源文件夹中,我有一个我想用作图标的图像,但我无法弄清楚如何获取它。我试过了
ImageIcon icon = new ImageIcon(getClass().getResource("settings.png"));
setIconImage(icon.getImage());
但是当我尝试访问图标的图像时,它会抛出NullPointerException
。我试图分离命令的各个部分,getResources("mypic.png")
返回null。
关于如何获得它的任何想法?提前谢谢!
答案 0 :(得分:4)
在委托之前,使用此算法从给定的资源名称构造绝对资源名称:
如果名称以'/'('\ u002f')开头,则资源的绝对名称是'/'后面的名称部分。
否则,绝对名称的格式如下: modified_package_name /名称
其中modified_package_name是此对象的包名称,其中'/'替换为'。' ( '\ u002e')。
所以你可能想要
getResource("/settings.png")
或
getResource("/resources/settings.png")
或类似的东西,取决于你的类路径,我相信。
答案 1 :(得分:0)
getClass()。getResource()将查找具有指定名称的资源,该资源从(相对于)调用getClass()的类的包开始。
如果你想要资源相对于jar的根,那么你应该做getClass()。getClassLoader()。getResource()
答案 2 :(得分:-1)
如果你不想弄乱类路径,无论如何,无论如何,有一种矫枉过正,但100%万无一失的方法可以根据以下两个事实起作用:
始终可以找到您的类(类)加载的 .jar 位于何处
.jar 文件只是一个zip文件,而Java有一个默认的API,允许读取zip文件。
它有点矫枉过正,但它“Just Works [TM]”(并且由于Java的各种保证,它不能起作用:你可以总是找到.jar和总是从 .jar 中读取)并且当您想要创建一个可在Windows,OS X上按原样启动的唯一 .jar 时非常方便Linux等等。
我们在部署在数百个不同系统上的应用程序上使用此overkill方法。