Получить ресурсы из файла JAR

Я хочу, чтобы мой jar-файл имел доступ к некоторым файлам из себя. Я знаю как это сделать для BufferedImage но это не работает для других файлов. Все, что я хочу, это извлечь несколько молний из моей банки. я сделал папку классов в Eclipse, положил молнии внутрь и использовал

    public File getResFile(String name){

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


}

чтобы получить File экземпляр и извлечь его. он хорошо работает в затмении, но как только я экспортирую его в банку, он говорит

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 часов и не могу найти решение. Пожалуйста помоги!

4 ответа

Решение

Есть причина, почему getResource() возвращает URLи не Fileпотому что ресурс может не быть файлом, и поскольку ваш код упакован в файл Jar, это не файл, а запись в формате zip.

Единственный безопасный способ чтения содержимого ресурса - это InputStreamлибо по телефону getResourceAsStream() или по телефону openStream() на возвращенный URL,

Сначала проверьте ваш путь к классу, используя Java System.out.println("classpath is: " + System.getProperty("java.class.path")); чтобы увидеть, есть ли у class path ваш файл jar.

А затем используйте getclass (). Classloader.getResourceAsStream (name). Проверьте правильность возвращенного URL. Вызовите метод isFile() для URL, чтобы проверить, действительно ли URL является файлом. А затем вызовите метод getFile().

Используйте Spring's 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);
    }
}

Используйте один из этих методов из класса 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, Если файл находится в корневом каталоге или в каком-либо другом каталоге внутри фляги, используйте /, из имени файла. подобно /data/names.json,

Другие вопросы по тегам