2013-09-02 3 views
0

У меня возникли проблемы с доступом к файлу в моем Jar в Windows. У меня нет этой проблемы, когда я запускаю ее в Unix. Я создал банку как на Windows & Unix, и это не имеет никакого значения. В любом случае это не работает в Windows.Доступ к файлу из jar в Windows

Я запустил команду jar -tf на моей банке, а класс, из которого я запущен, находится в: a/b/c/d/ClassOne.class. Класс Я ищу находится в моем базовом каталоге кувшина: ClassTwo.class

Мой код в этом ClassOne выглядит следующим образом:

String path = File.separator + "myYAML.yml"; 
InputStream in = MetricCollector.class.getResourceAsStream(path); 
InputStreamReader isr = new InputStreamReader(in); 
BufferedReader input = new BufferedReader(isr); 

Мой код изломов на последней строке показано метании NullPointerException, которое я могу только верю, означает, что он не может найти путь, который я ему дал. Однако этот точный код отлично работает на моем отладчике и в Unix, когда я запускаю банку.

Я также протестировали следующие пути:

  1. "myYAML.yml"
  2. File.seperator + ".." + File.seperator + ".." + File.seperator + ".." + File.seperator + ".." + "myYAML.yml"
  3. ".." + File.seperator + ".." + File.seperator + ".." + File.seperator + ".." + "myYAML.yml"

все безрезультатно.

Я использовал следующие сообщения о переполнении стека, чтобы получить насколько я могу, но они, кажется, не имеют ответа для меня: How to reference a resource file correctly for JAR and Debugging?, Accessing resources within a JAR file и Reading file from within JAR not working on windows

Любая дополнительная помощь, я бы очень благодарен , Заранее спасибо.

ответ

3

File.separator не может работать на Windows, он возвращает \. Вы должны использовать / в качестве разделителя независимо от ОС.

В Class#getResource(String) состояния

Перед делегацией, абсолютное имя ресурса строится из данного имени ресурса с помощью этого алгоритма:

Если имя начинается с «/» («\ u002f»), то абсолютное имя ресурс - это часть имени, следующего за '/'. В противном случае, абсолютное имя следующего вида: modified_package_name/имя

Где modified_package_name это имя пакета этого объекта с «/» заменить на «» ('\ U002e').

Другими словами, вы должны использовать /. Это далее объясняется в javadoc для ClassLoader.html#getResource(java.lang.String), которому делегаты Class#getResource.

Имя ресурса - это/-разделенный путь, который идентифицирует ресурс .

Если ресурс находится в корневом каталоге пути к классам, используйте

InputStream in = MetricCollector.class.getResourceAsStream("/myYAML.yml"); 
+0

Чтобы расширить немного больше: при работе с 'класса File' вы можете * всегда * используйте'/'в Java - даже на Windows –

+0

Это сработало отлично. Спасибо за ответ и за подробное объяснение. –

+0

@Cameron Добро пожаловать. –

Смежные вопросы