【问题标题】:Eclipse exported Runnable JAR not showing imagesEclipse 导出的 Runnable JAR 不显示图像
【发布时间】:2014-10-27 10:35:51
【问题描述】:

运行从 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();
}

有什么建议吗?

【问题讨论】:

  • getClass().getResource("/resources/header.jpg"); 中删除/resources,因为当您构建应用程序的JAR 时,将没有/resources 目录。
  • resources 是否包含在构建路径中?
  • 是的,它们在构建路径中,并且在查看 JAR 内容时位于 JAR 中...

标签: java eclipse image jar embedded-resource


【解决方案1】:

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

示例1:(资源in src)

步骤:

  1. 文件结构

  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. 【右键项目】→【导出】→【可运行的jar文件】→【设置启动配置】

  4. 利润

仅供参考,同样的设置也可以在 eclipse 中运行


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

步骤:

  1. 文件结构(注意资源看起来像一个普通文件夹)

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

    • 右击项目,进入【构建路径】→【配置构建路径】

    • 从对话框的 [Sources] 选项卡中,选择 [Add Folder],然后在新对话框中选择 [resources] 文件夹

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

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

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


更新

设置启动配置

通常,一旦您运行类(即右键单击类并作为 Java 应用程序运行),就会设置运行配置。您需要将其设置为清单中的启动点。但这里是手动操作的方法。

步骤:

  1. 【右键项目】→【属性】→【运行/调试设置】

    您可以看到我已经有一个运行配置(这是通过简单地运行类隐式设置的)。但是要新建一个,选择【新建】→【Java应用】

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

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

  4. 像上面一样运行 jar。


编辑

检查结果

清单:

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

提取的罐子:

【讨论】:

  • @peeskillet 你能回答我的问题吗? stackoverflow.com/questions/38685537/…
  • @peeskillet 拯救了我的一天。我正在探索我的代码以寻找可能的#bug。但意识到这是问题所在
  • 我已经尝试了你发布的每一个解决方案,最后一个可行的方法是使用这个 Launcher.class.getResource() ,其中 Launcher 是我的主要功能。
【解决方案2】:

关于从 Eclipse 创建一个可运行的 JAR 文件我们可以参考文章“Creating Runnable Jars in Eclipse (or other IDE...or by hand):” (https://www.cefns.nau.edu/~edo/Classes/CS477_WWW/Docs/RunnableJarsinEclipse.html),它提到我们需要做四件事作为

  1. 确保为我们的代码创建一个包,而不仅仅是在 Eclipse 中创建一个项目
  2. 在我们代码的主包下为我们的资源文件创建子包(子文件夹)(注意子包在主包下,不只是在项目中)
  3. 从 getResource() 获取所有文件引用(获取 URL 引用)
  4. 在 Eclipse 中将文件导出为可运行的 JAR(文件 -> 导出... -> 选择可运行的 JAR 文件 -> 下一个 -> ...)

但是对于上篇示例代码中的图片文件,它只创建了ImageIcon,它没有创建SWT Image,关于如何从URL获取SWT Image或如何将ImageIcon转换为SWT Image,下面是从 URL 获取 SWT Image 的示例代码,

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】:

    问题是我的 Windows 配置文件中有这个项目...有一个“!”在其中...(DeNitE!-> 是我的 Windows 配置文件的名称)

    一旦我将它更改为 DeNitE(没有!),它就可以正常工作...

    【讨论】:

      【解决方案4】:

      我发现你改的时候:

      将需要的库打包到生成的jar中

      将需要的库提取到生成的jar中

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

      【讨论】:

        【解决方案5】:

        除非您必须将文件放在 jar 中,否则这可能是最简单的方法:

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

        header 必须是 Image/BufferedImage。这将转到可运行 jar 所在的文件夹并查找名为资源的文件夹。 http://i.stack.imgur.com/x8xtO.png

        【讨论】:

          【解决方案6】:

          两个简单的步骤:

          1 - 将文件夹添加到构建路径;

          2 - 使用这个:

              InputStream url = this.getClass().getResourceAsStream("/load04.gif");
              myImageView.setImage(new Image(url));
          

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

            • 不,这是错误的。 5 分钟前刚刚测试过。
            【解决方案8】:

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-11-15
              • 2014-08-05
              • 1970-01-01
              • 2011-06-25
              • 1970-01-01
              • 2017-09-30
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多