ClassNotFoundException при запуске jar
Есть проект, нормально запускается в IDEA, но при создании jar файла он просто не запускается, а при попытке запустить через консоль при помощи java -jar путь_до_файла\файл.jar выдает следующую ошибку:
Exception in thread "main" java.io.FileNotFoundException: resources\final_count.txt (Системе не удается найти указанный путь)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:211)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:153)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:108)
at java.base/java.io.FileReader.<init>(FileReader.java:60)
at com.my.projects.SpaceObjectsTest.main(SpaceObjects.java:57)
Программа использует 3 текстовых файла, один из которых почему-то не может найти, хотя при составлении структуры проекта я все закинул в jar (пробовал разархивировать и посмотреть, правда ли они там есть - есть). Подскажите, пожалуйста, в чем проблема. Также выкладываю содержимое MANIFEST.
Manifest-Version: 1.0
Main-Class: myprojects.SpaceObjectsTest
В самом коде путь до файла указал так:
"/final_count.txt"
Ответы (1 шт):
Из стектрейса видно, что используется доступ к файлу по имени resources\final_count.txt. Когда процесс пробует открыть файл по относительному пути, то это путь ищется относительно текущей рабочей директории процесса (в java насколько мне известно нельзя поменять текущую рабочую директорию).
При запуске командой java -jar путь_до_файла\файл.jar текущей рабочей директорией будет та из которой запускается команда java т.е. первая директория в путь_до_файла. Соответственно, программа будет искать файл в каталоге resources текущего каталога. Именно поэтому у вас не работает, когда вы помещаете файл относительно каталога в котором находится файл.jar.
Чтобы можно было достать файл именно из jar, нужно открывать его не с помощью API доступа к файловой системе типа FileReader, а используя getResource или getResourceAsStream у класса ClassLoader. Например, если вы положили файл в корень jar файла, то получить поток можно так:
try (InputStreamReader isr = new InputStreamReader(
this.getClass().getResourceAsStream("/final_count.txt")) {
// используем isr точно так же как и FileReader
}
Если положить файл в какую-то папку внутри фай.jar файла, то нужно указать полный путь от корня jar файла.