【问题标题】:Get resources from a jar file从 jar 文件中获取资源
【发布时间】:2015-10-21 16:43:49
【问题描述】:

我希望我的 jar 文件能够从自身访问一些文件。我知道如何为BufferedImage 执行此操作,但这不适用于其他文件。我想要的只是从我的罐子里提取一些拉链。我在 Eclipse 中创建了一个类文件夹,将 zip 放入其中并使用

    public File getResFile(String name){

    return new File(getClass().getResource(name).getFile());


}

获取File 实例并提取它。它在 Eclipse 中运行良好,但是一旦我将其导出到 jar 中,它就会显示

Exception in thread "main" java.io.FileNotFoundException: file:\C:\Users\DeLL\Desktop\BoxcraftClient\ClientInstaller.jar!\client.bxc (The filename, directory name, or volume label syntax is incorrect)
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.<init>(ZipFile.java:220)
    at java.util.zip.ZipFile.<init>(ZipFile.java:150)
    at java.util.zip.ZipFile.<init>(ZipFile.java:164)
    at Launcher.install(Launcher.java:43)
    at Launcher.main(Launcher.java:33)

我正在努力解决这个问题,大约需要 6 个小时,但找不到解决方案。请帮忙!

【问题讨论】:

    标签: java eclipse jar zip


    【解决方案1】:

    getResource() 返回URL 而不是File 是有原因的,因为资源可能不是文件,而且您的代码被打包在 Jar 文件中,它不是一个文件,而是一个 zip 条目。

    读取资源内容的唯一安全方法是作为InputStream,通过调用getResourceAsStream() 或在返回的URL 上调用openStream()

    【讨论】:

    • 非常感谢。这解决了它。
    【解决方案2】:

    首先使用 java System.out.println("classpath is: " + System.getProperty("java.class.path")); 检查你的类路径,看看类路径是否有你的 jar 文件。

    然后使用getclass().classloader.getResourceAsStream(name)。查看返回的 URL 是否正确。在 URL 上调用方法 isFile() 以检查 URL 是否实际上是一个文件。然后调用 getFile() 方法。

    【讨论】:

    • 好吧,这会解决它,但我先阅读了顶部的,所以我接受了那个作为正确的。抱歉,感谢您的回复
    【解决方案3】:

    使用 Spring 的 PathMatchingResourcePatternResolver

    它可以从 IDE 或文件系统启动包:

    public List<String> getAllClassesInRunningJar() throws Exception {
        try {
            List<String> list = new ArrayList<String>();
    
            // Get all the classes inside the package com.my.package:
            // This will do the work for both launching the package from an IDE or from the file system:  
            String scannedPackage = "com.my.package.*";
    
            // This is spring - org.springframework.core; use these imports:
            //  import org.springframework.core.io.Resource;
            //  import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
            PathMatchingResourcePatternResolver scanner = new PathMatchingResourcePatternResolver();
            Resource[] resources = scanner.getResources(scannedPackage.replace(".", "/"));
    
            for (Resource resource : resources)
                list.add(resource.getURI().toString());
            return list ;
        } catch (Exception e) {
            throw new Exception("Failed to get the classes: " + e.getMessage(), e);
        }
    }
    

    【讨论】:

      【解决方案4】:

      使用这些方法之一,来自 Class 类 - getResource(java.lang.String) - getResourceAsStream(java.lang.String)

          this.getClass().getResource(name);
          this.getClass().getResourceAsStream(name);
      

      警告:默认情况下,它会从包中找到this.class 的位置加载文件。因此,如果从类org.organisation.project.App 中使用它,则该文件需要在目录org/organisation/project 的jar 中。如果文件位于 jar 内的根目录或其他目录中,请使用文件名中的 /。喜欢/data/names.json

      【讨论】:

      • 好吧,这会解决它,但我先阅读了顶部的,所以我接受了那个作为正确的。抱歉,感谢您的回复
      猜你喜欢
      • 2019-11-08
      • 2017-08-23
      • 1970-01-01
      • 2011-04-19
      • 2015-01-12
      • 2021-11-21
      相关资源
      最近更新 更多