【问题标题】:Referencing files inside a JAR引用 JAR 中的文件
【发布时间】:2012-07-15 06:37:01
【问题描述】:

我正在为一些串行端口通信创建一个 Java 应用程序,在该应用程序的文件夹中,我有两个资源需要在运行时出现。第一个是用作启动屏幕的图像,另一个是需要在程序启动时读取的配置文件。

这是 Linux 中“tree”命令输出的精简版本,我需要引用的两个文件是“commandSet.config”和“splash-screen2.png”

.
├── bin
│   ├──...
├── commandSet.config
├── app-manifest.txt
├── splash-screen2.png
└── src
    ├── events
    │   └── InterfaceEvents.java
    ├── models
    │   ├── Command.java
    │   └── Phone.java
    ├── operations
    │   ├── Application.java
    │   ├── ...
    └── views
        ├── CallDialog.java
        ├── SplashScreen.java
        └── Window.java

我目前在以下几行中引用:

BufferedReader in = new BufferedReader(new FileReader("commandSet.config"));

JLabel image = new JLabel(new ImageIcon("splash-screen2.png"));

当我从 Eclipse 运行它时,它工作得很好,但是一旦我导出到可运行的 JAR,文件就不会移动,因此不会被正确引用。我尝试将它们移动到“src”文件夹中,这导致它们被存档在 JAR 中,但我仍然无法引用它们。

我对导出 Java 项目的概念还很陌生,所以我可能遗漏了一些明显的东西。如果有人可以向我展示执行此操作的最佳方法以及未来项目文件系统的最佳方法,我将不胜感激。干杯!

【问题讨论】:

    标签: java eclipse file jar structure


    【解决方案1】:

    您无法像在文件系统中那样访问该文件。

    使用上下文中的getResourceAsStream() 使用类加载器从 CLASSPATH 中读取它。

    【讨论】:

    • 好的,文件应该存储在哪里以便以这种方式引用它们?
    • 当然是在您部署应用程序的 JAR 或 WAR 中。由于类加载器在 CLASSPATH 中查找,因此您需要它们位于 CLASSPATH 中。在您的 JAR 中,它位于清单类路径中。在您的 WAR 中,这是 WEB-INF/classes 文件夹
    • 好的,作为参考,我只使用 JAR。我不完全确定你的意思,“你需要它们在 CLASSPATH 中”?我有一个清单文件,其中包含以下内容: Main-Class: operations.Application
    【解决方案2】:
     InputStream in = this.getClass().getClassLoader().getResourceAsStream("splash-screen2.png");  
    byte[] buffer = new byte[in.available()];
    in.read(buffer);  
    ImageIcon icon = new ImageIcon(buffer);
    

    【讨论】:

    • 这会返回一个 inputStream 对吧?接受 inputStream 对象作为参数的 ImageIcon 没有构造函数重载。
    • 您需要将 InputStream 的内容加载到一个 byte[] 数组中并使用该构造函数。
    • 使用这种方法我得到一个空指针异常,但是,删除前导/正确加载它,导出到 JAR 时问题仍然存在。
    • 写“splash-screen2.png”而不是“/splash-screen2.png”。我在我的答案中改变了这个
    【解决方案3】:

    好的,我设法破解了这个问题,并认为我将来会为其他人提供答案。我基本上遵循“duffymo”的指导方针,这就是我所做的:

    • 用我的资源创建了一个 JAR。
    • 将该 JAR 放在项目的 root 中。
    • 使用 Eclipse 将该 JAR 添加到构建路径中。
    • 使用 getResourceAsStream("/nameOfFile.ext") 为我的资源获取流。

    干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多