从网络启动时,列出可运行jar中的资源失败

时间:2019-07-01 07:46:25

标签: java networking jar resources

我已经编写了一个Java swing应用程序,该应用程序必须从资源中查找其图标。因此,我想在可运行的jar文件的特定文件夹中找到任何png。我不知道在那里会有什么名字。

要在资源文件夹中查找png,请使用以下代码:

private List<String> getResourceFolderFileNames(String folder) {
    List<String> names = new ArrayList<>();
    File jarFile = new File(getClass().getProtectionDomain().getCodeSource().getLocation().getPath());
    System.out.println("Folder to search in: " + folder);
    try {
        if (jarFile.isFile()) {
            System.out.println("This is a jar file dir");
            JarFile file = new JarFile(jarFile);
            Enumeration<JarEntry> entries = file.entries();
            List<JarEntry> jarEntries = new ArrayList<>();
            while (entries.hasMoreElements()) {
                jarEntries.add(entries.nextElement());
            }
            System.out.println("Number of entries: " + jarEntries.size());
            for (JarEntry e: jarEntries
                 ) {
                String name = e.getName();
                if (name.matches(".*/" + folder + "/[0-9]+\\.png")) {
                    name = name.split("/")[2];
                    System.out.println("Added name: " + name);
                    names.add(name);
                }
            }
        } else {
            System.out.println("This is not a jar file");
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            URL url = loader.getResource("resources/" + folder);
            String path = url.getPath();
            for (File f: new File(path).listFiles()
                 ) {
                names.add(f.getName());
            }
        }
    } catch (Exception e) {
        System.out.println(e.getMessage() + "catch in get Resource folder file names");
    }
    return names;
}    

该代码的理想行为是,它将返回一个包含所有******。png文件名的字符串列表。

else部分实际上还不能工作,但是程序永远无法到达。这部分适用于在IDE中开始搜索的情况,因为它在那里的工作方式有所不同(指出了其他一些问题)。似乎在“ jarFile.isFile()”上确实失败了。

错误:

当我在Windows或Mac上启动导出的可运行jar文件时,它工作得很好。它确实做了它应该做的。如果我从网络文件夹启动相同的可运行jar文件,则找不到png文件。

项目结构

这是我的图标所在的位置

--src/
    --resources/
        --iconfolder1
        --iconfolder2

如果现在需要更多信息,我会尽力帮助您。非常感谢。

修改1:

现在它可以在IDE中再次使用,但仍然不能在网络上使用。

br 亚历克斯

1 个答案:

答案 0 :(得分:0)

代码本身实际上没有错。

发生的事情是,getLocation返回一个URL,因此使用getPath进行URL编码。因此,当路径中有空格时,它们将被编码为%20。 File的构造函数不会对此进行解码,因此无法读取路径。

File jarFile = new File(URLDecoder.decode(getClass().getProtectionDomain().getCodeSource().getLocation().getPath(), "UTF-8"));

因此,在创建新文件之前对字符串进行解码将按预期执行。