classLoader.getResource не работает в файле jar

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URL url = classLoader.getResource("com/x/y/z.cfg");
File file = new File(url.getPath());

Это работает при запуске файла jar из Eclipse, но не работает при запуске в файле jar.

java.io.FileNotFoundException: файл:\C:\Users\nova\Desktop\Matcher.jar!\c om\x\y\z.cfg

Это не дубликат. Я проверил все остальные вопросы, никакой полезной информации.


person Insignificant Person    schedule 31.10.2014    source источник
comment
Что ты собираешься делать с этим File, когда он у тебя есть? Вы не можете создать File из URL, которое вы получаете для ресурса в JAR (поскольку это не URL-адрес file:, обычно это jar:file:/path/to/file.jar!/com/x/y/z.cfg), но если используемый вами API может принимать URL или InputStream вместо File тогда не надо.   -  person Ian Roberts    schedule 31.10.2014
comment
Это объясняется много раз: здесь, здесь, здесь. На самом деле причина в том, что File представляет собой объект файловой системы, а содержимое jar недоступно для файловой системы (но Java может каким-то образом справиться с этим - как InputStream).   -  person Stanislav Lukyanov    schedule 31.10.2014
comment
URL.getFile() не преобразует URL-адрес в действительный путь к файлу. Он просто возвращает часть пути URL-адреса. (Во времена Java 1.0 большинство URL-адресов ссылались на физические файлы, поэтому метод называется getFile.)   -  person VGR    schedule 01.03.2017


Ответы (2)


Когда файл упакован внутри jar, он становится потоком байтов вместо обычного объекта File.

Пытаться

InputStream stram=getClass().getClassLoader().getResourceAsStream(relativePath);

Дополнительное руководство...

Прочтите аналогичный пост здесь и здесь

person Braj    schedule 31.10.2014

Вы не можете создать экземпляр File, потому что единственный файл, который у вас есть, — это JAR. Вот почему getResource() возвращает URL. Вы можете получить поток, используя метод URL.openStream() для чтения содержимого.

person McMonster    schedule 31.10.2014