如何从JAR中访问图像

时间:2010-03-04 18:33:36

标签: java resources jar

我知道此问题(或类似的问题)之前已被问过,但我仍然不理解。我创建了一个具有以下内部结构的jar:

JAR文件

-configuration

--- codeBehind

--- COMMANDLINE

--- GUI

---资源

在资源文件夹中,我有一个我想用作图标的图像,但我无法弄清楚如何获取它。我试过了

ImageIcon icon = new ImageIcon(getClass().getResource("settings.png"));
setIconImage(icon.getImage());

但是当我尝试访问图标的图像时,它会抛出NullPointerException。我试图分离命令的各个部分,getResources("mypic.png")返回null。

关于如何获得它的任何想法?提前谢谢!

3 个答案:

答案 0 :(得分:4)

来自the documentation of Class

  

在委托之前,使用此算法从给定的资源名称构造绝对资源名称:

     
      
  • 如果名称以'/'('\ u002f')开头,则资源的绝对名称是'/'后面的名称部分。

  •   
  • 否则,绝对名称的格式如下:   modified_pa​​ckage_name /名称

  •   
     

其中modified_pa​​ckage_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方法。