Eclipse导出的Runnable JAR没有显示图像

时间:2014-09-03 03:08:45

标签: java eclipse image jar embedded-resource

运行从Eclipse导出的JAR文件时,不会加载我的图像。

我在资源类包中有图像。我已经尝试了一个图像源文件夹,但没有运气。

从Eclipse加载时工作正常。图像位于导出的JAR文件中,因此它们导出正常。

我试过了:

label.setIcon(new ImageIcon(MainFrame.class.getResource("/resources/header.jpg")));

我也试过了:

URL url = getClass().getResource("/resources/header.jpg");
Image image = Toolkit.getDefaultToolkit().getImage(url);
label.setIcon(new ImageIcon(image));

try
{
    label.setIcon(new  ImageIcon(ImageIO.read(getClass().getResource("/resources/header.jpg"))));
}
catch (IOException e1)
{
    e1.printStackTrace();
}

有什么建议吗?

7 个答案:

答案 0 :(得分:76)

对我来说很好。检查你可能有什么不同。

示例1 :(资源 in src)

步骤:

  1. 文件结构

    enter image description here

  2. 代码

    package com.stackoverflow.test;
    
    import java.net.URL;
    import javax.swing.*;  // Wild carded for brevity. 
                           // Actual code imports single classes
    public class Main {
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable(){
                public void run() {
                    URL url = Main.class.getResource(
                                         "/resources/stackoverflow.png");
                    ImageIcon icon = new ImageIcon(url);
                    JFrame frame = new JFrame();
                    frame.add(new JLabel(icon));
                    frame.pack();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    }
    
  3. [右键单击项目]→[导出]→[Runnable Jar文件]→[设置启动配置]

    enter image description here

  4. 利润

    enter image description here

  5. 仅供参考,同样的设置在eclipse中运行也很好


    示例2:(资源不是在src中 - 但在项目中)

    步骤:

    1. 文件结构(通知资源看起来像普通文件夹)

      enter image description here

    2. 我们现在要做的是将资源放在构建路径上。这样做是将所有内容放在类路径中的文件夹中(文件夹本身除外)

      • 右键单击项目并转到[Build Path]→[Configure Build Path]

        enter image description here

      • 从对话框的[来源]选项卡中选择[添加文件夹],然后在新对话框中选择[资源]文件夹

        enter image description here

      • 现在资源文件夹的内容位于构建路径中(注意文件夹中的小包装

        enter image description here

    3. 新代码不再使用路径的资源前缀

      URL url = Main.class.getResource("/stackoverflow.png");
      
    4. 与上面的步骤3和4相同,并且获利!


    5. <强>更新

      设置启动配置

      通常,一旦运行该类(即右键单击类并运行为Java应用程序),将设置运行配置。您需要将此设置为清单中的启动点。但这是如何手动完成的。

      步骤:

      1. [右键单击项目]→[属性]→[运行/调试设置]

        enter image description here 您可以看到我已经有一个运行配置(通过简单地运行该类隐式设置)。但要创建新的,请选择[新建]→[Java应用程序]

      2. 为运行配置创建名称并浏览或键入主要启动类。就我而言,它是com.stackoverflow.test.Main

        enter image description here

      3. 现在,如上例所示导出时,选择运行配置

        enter image description here

      4. 像上面一样运行jar。


      5. 修改

        检查结果

        清单:

        Manifest-Version: 1.0
        Rsrc-Class-Path: ./
        Class-Path: .
        Rsrc-Main-Class: com.stackoverflow.test.Main
        Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
        

        提取的jar:

        enter image description here

答案 1 :(得分:2)

我发现你改变的时候:

  

将所需的库打包到生成的jar

  

将所需的库提取到生成的jar

在设置启动配置中,它对我有用。

Extract Required Libraries Button

答案 2 :(得分:1)

为了从Eclipse创建可运行的JAR文件,我们可以参考文章&#34;在Eclipse中创建Runnable Jars(或其他IDE ......或手工):&#34; (https://www.cefns.nau.edu/~edo/Classes/CS477_WWW/Docs/RunnableJarsinEclipse.html),它提到我们需要做四件事

  1. 确保为我们的代码创建一个包,而不仅仅是在Eclipse中创建一个项目
  2. 为我们的代码主包下的资源文件创建子包(子文件夹)(注意子包在主包下,不仅在项目中)
  3. 从getResource()获取所有文件引用(获取URL引用)
  4. 在Eclipse中将文件导出为可运行的JAR(文件 - &gt;导出... - &gt;选择Runnable JAR文件 - &gt; next - &gt; ...)
  5. 但是对于上面文章示例代码中的图像文件,它只创建了ImageIcon,它没有创建SWT图像,互联网上有很多关于如何从URL获取SWT图像或如何将ImageIcon转换为SWT Image,下面是从URL获取SWT图像的示例代码,

    Image imgSWT=null;  // Image class is the SWT Image class
    ImageDescriptor imgDesc=null;
    java.net.URL imgURL = YourClassName.class.getResource("path/image_filename");
    
    if (imgURL != null) {
        imgDesc = ImageDescriptor.createFromURL(imgURL);
        imgSWT = imgDesc.createImage();
    }
    

答案 3 :(得分:1)

我有同样的问题.. 你可以用这个..

Image Icon= new ImageIcon(new WE4().getClass().getResource("IC.jpg"))

这里WE4是我的类构造函数名称。 希望它有所帮助。

答案 4 :(得分:0)

问题是我的Windows配置文件中有这个项目......有一个“!”在它...(DeNitE! - &gt;是我的Windows个人资料的名称)

一旦我将其更改为DeNitE(没有!),它工作得很好......

答案 5 :(得分:0)

除非你必须在jar中拥有文件,否则这可能是最简单的方法:

header = ImageIO.read(new File("./resources/header.jpeg"));

标头必须是Image / BufferedImage。这将转到runnable jar所在的文件夹,并查找名为resources的文件夹。 http://i.stack.imgur.com/x8xtO.png

答案 6 :(得分:0)

另一种解决方法是,如果将资源文件,.jar文件放在同一位置,它应该可以正常工作。唯一的缺点是你必须始终拥有jar文件的资源。

如果这不是问题,你可以这样做。