Java не получает файл в исходном коде при компиляции

Недавно у меня возникла проблема с Java. Я пробовал кое-что, что нашел в Интернете, но они не сработали, поэтому мне нужна помощь. У меня есть проект Java в Eclipse. Мой основной класс находится в src/programCode/UI_Main2.java. В этом .java я пытаюсь получить доступ к файлу в src/files/File.file

И это когда вещи странные.

  • Если я использую /src/files/File.file, это дает мне NoSuchFileException.

  • Если я использую src/files/File.file, он работает в Eclipse, но когда я компилирую его в исполняемый файл .jar, он дает мне NoSuchFileException.

  • Если я использую /files/File.file, это дает мне NoSuchFileException.

  • Если я использую files/File.file, это дает мне NoSuchFileException.

  • Если я использую files/File.file, это дает мне NoSuchFileException.

  • Если я использую this.getClass().getResource("/files/File.file").getPath().substring(1) (без подстроки, это дает мне недопустимый символ), это дает мне NoSuchFileException (но показывает мне абсолютный путь, и файл там существует!)

  • Если я использую this.getClass().getResource("files/File.file").getPath(), это дает мне NullPointerException и программа вылетает.

  • Если я использую this.getClass().getResource("src/files/File.file").getPath(), это дает мне NullPointerException и программа вылетает.

  • Если я использую this.getClass().getResource("/src/files/File.file").getPath(), это дает мне NullPointerException и программа вылетает.

Итак, я не знаю, что делать. src/files/File.file - единственный, который работает, но он не работает при компиляции в исполняемый файл jar. Так что, пожалуйста, помогите мне, я еще не нашел решения. Спасибо!


person eric.m    schedule 18.07.2014    source источник
comment
Исходный код обычно недоступен для скомпилированных программ, но ресурсы доступны.   -  person nanofarad    schedule 19.07.2014


Ответы (2)


Поиск файла зависит от двух вещей:

  • Используете ли вы абсолютный или относительный путь
  • Где находится ваш рабочий каталог

В Unix-подобной системе, когда вы используете путь типа /dir1/dir2/file, вы используете абсолютный путь, поэтому ваш рабочий каталог не имеет значения, но у вас должен быть файл точно по этому пути.

В вашем случае вы пытаетесь использовать относительный путь, поэтому вам не следует использовать / в начале.

Этот случай имеет решающее значение для вашей проблемы:

"If I use src/files/File.file it works in Eclipse but when I compile it to a executable .jar it gives me NoSuchFileException." 

По умолчанию Eclipse использует в качестве рабочего каталога родительский каталог src (который обычно является каталогом вашего проекта), поэтому, начиная с него, у вас действительно есть файл по этому пути.

Когда вы запускаете .jar, ваш рабочий каталог находится где-то еще. Поместите свой .jar в родительский каталог src, и он должен работать.

Теперь я предлагаю вам изменить местоположение файла на каталог, отличный от src (назовите его Resurces или как-то так), и указать его вместе с файлом .jar.

Кроме того, вот интересное обсуждение рабочих каталогов и .jar файлов:

Текущий рабочий каталог при запуске Jar

Если вы хотите распространять один .jar, вот хорошая инструкция по упаковке:

http://www.cefns.nau.edu/~edo/Classes/CS477_WWW/Docs/pack_resources_in_jar.html

person Darth Hunterix    schedule 18.07.2014
comment
Спасибо, теперь заработало! Но как я могу сделать это только в одном .jar без папки? Я скомпилирую еще одну банку с папкой и банкой приложения внутри? - person eric.m; 19.07.2014
comment
Вот простая инструкция: java Или более подробный: cefns. nau.edu/~edo/Classes/CS477_WWW/Docs/ - person Darth Hunterix; 19.07.2014

Предполагая, что вы намерены запустить скомпилированную программу на ВАШЕМ собственном компьютере для разработки, вам необходимо указать полный путь к нужному файлу. Этот полный путь будет иметь форму

<Eclipse workspace location>\<project name>\<file location in project>
person ErstwhileIII    schedule 18.07.2014
comment
Спасибо, но я хочу использовать его и на других компьютерах xD - person eric.m; 19.07.2014