Java 日食不';不能正确地输出资源

Java 日食不';不能正确地输出资源,java,eclipse,resources,export,Java,Eclipse,Resources,Export,当我从Java运行我的程序时,一切都很好。如果我将程序导出到一个可运行的.jar,程序就不会启动。 当我复制资源文件夹并将我的图片放在runable.jar旁边时,它就开始了。资源文件夹通常位于我的src文件夹中。 runnable jar确实包含一个带有pics的资源文件夹。 它位于具有包名称的文件夹旁边 我曾经 Icon cancelIcon = new ImageIcon(this.getClass().getClassLoader().getResource("resources/can

当我从Java运行我的程序时,一切都很好。如果我将程序导出到一个可运行的.jar,程序就不会启动。 当我复制资源文件夹并将我的图片放在runable.jar旁边时,它就开始了。资源文件夹通常位于我的src文件夹中。 runnable jar确实包含一个带有pics的资源文件夹。 它位于具有包名称的文件夹旁边

我曾经

Icon cancelIcon = new ImageIcon(this.getClass().getClassLoader().getResource("resources/cancelIcon.png"));

为什么我的程序在导出后不能工作

当我复制资源文件夹并将我的图片放在runable.jar旁边时,它就开始了

这是因为当您导出runnable.jar时,它在库处理下为您提供了三个选项

  • 将所需库提取到生成的JAR中
  • 将所需库打包到生成的JAR中
  • 将所需库复制到生成的JAR旁边的子文件夹中
您可能已经选择了第三个,即当您复制.jar旁边的子文件夹时,为什么它会正常运行

我建议在导出时选择第一个(提取…),然后再次尝试运行.jar

您的
resources
文件夹(包含图像)应该位于
src
文件夹中…要在java中设置
imageIcon
,您可以像这样使用
Toolkit

public class Main extends JFrame{
  private JPanel MainPanel;

  public static void main (String[] args){      //--main method --//
      Main window = new Main();
      window.setVisible(true);
  }

  private Main(){                               //--constructor --//

      MainPanel = new JPanel(null);

      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource("resources/cancelIcon.png")));

      this.add(MainPanel);
  }
}

希望它能有所帮助。

问题是,eclipse不关心路径中的大小写敏感性,但导出的jar关心。 我有一个文件“animation.GIF”,源代码中有“animation.GIF”。Eclipse不在乎,罐子在乎

public class Main extends JFrame{
  private JPanel MainPanel;

  public static void main (String[] args){      //--main method --//
      Main window = new Main();
      window.setVisible(true);
  }

  private Main(){                               //--constructor --//

      MainPanel = new JPanel(null);

      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource("resources/cancelIcon.png")));

      this.add(MainPanel);
  }
}