从jar文件中获取资源

时间:2015-10-21 16:43:50

标签: java eclipse jar zip

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

BufferedImage

获取 public File getResFile(String name){ return new File(getClass().getResource(name).getFile()); } 实例并将其解压缩。它在eclipse中运行良好,但只要我将它导出到一个罐子里就可以了

File

我正在努力解决这个问题,已经有6个小时了,无法找到解决方案。请帮忙!

4 个答案:

答案 0 :(得分:2)

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

阅读资源内容的唯一安全方式是InputStream,可以通过调用getResourceAsStream()或在返回的openStream()上调用URL。 / p>

答案 1 :(得分:1)

使用其中一种方法,来自班级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中的根目录或其他目录中,请使用文件名中的/ in。与/data/names.json一样。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

使用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);
    }
}