程序在IDE中使用jar文件中的资源运行,但应用程序无法读取它们 - 为什么?

时间:2016-11-29 02:57:31

标签: java jar nullpointerexception ide resources

情景:

  • 我的应用树中有一个包含图片的目录/文件夹
    • ancilliaryUI/Graphics/FAS-IconFiles/{*.png}
  • 在IDE(netbeans)中,我的代码将资源作为Inputstream获取  /ancilliaryUI/Graphics/FAS-IconFiles
    • getContextClassLoader().getResourceAsStream(resource);
    • 如果以上返回null,我会使用getClass().getResourceAsStream(resource)
  • 我使用上面的InputStreamReader
  • 来实例化InputStream
  • 我使用BufferedReader
  • 实例化InputStreamReader

以上所有工作都在IDE和程序代码中(返回有效对象)

  • 然后我用BufferedReader循环br.readLine()
    • 这样做符合预期:每次迭代都会返回图像的String名称 在/ancilliaryUI/Graphics/FAS-Icon-Files路径
    • 然后我使用它将资源提取为流并创建 IconImage。都好。 当我构建应用程序时,我会查看jar文件,所有图像都在正确的路径中。

如果我将应用程序运行为:

java -jar appname.jar 

我从br.readLine()得到一个NullPointerException,即使我上面的任何对象都不为null。 注意:br.readLine只会读取资源名称'每个图像并将字符串传回给另一个创建ImageIcon的方法。资源名称'由于异常,字符串永远不会返回。然而,如果从IDE运行,所有这些都可以正常工作。

任何帮助将不胜感激。 谢谢!

这里是代码(在绝望中加载调试):

    private List<String> getResources(String path) throws IOException {
    List<String> filenames = new ArrayList<>();
    BufferedReader br = null;

    Debug.printm("PATH = " + path);

    try {
        InputStream in = getResourceAsStream(path);
        InputStreamReader isReader = new InputStreamReader(in);
        Debug.printm("isReader = " + isReader.toString());
        br = new BufferedReader(isReader);
    } catch (Exception e) {
        throw e;
    }
    String resource;
    Debug.printm("Going to readLine(" + path + "): br = " + br.toString());
    try {
        while ((resource = br.readLine()) != null) { 
            Debug.printm("Adding resource: " + resource);
            filenames.add(resource);
        }
    } catch (Exception e) {
        Debug.printm("readLine(): " + e.getLocalizedMessage());
        throw e;
    }
    Debug.printm("path = " + path);
    return filenames;
}

private InputStream getResourceAsStream(String resource) {
    final InputStream in
            = getContextClassLoader().getResourceAsStream(resource);

    return in == null ? getClass().getResourceAsStream(resource) : in;
}

private ClassLoader getContextClassLoader() {
    return Thread.currentThread().getContextClassLoader();
}

2 个答案:

答案 0 :(得分:0)

到这里它可能会给你一些关于如何解决困境的提示

https://netbeans.org/kb/docs/java/editor-codereference.html

答案 1 :(得分:0)

我通过广泛搜索How can I get a resource "Folder" from inside my jar File?找到了解决方案。我选择以不同方式实现我的资源列表,并且更快。但是,我将保留此代码段以供将来参考。 谢谢user1079877!