Получить ресурсы из файла 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
,