Java - проблема с classpath - PullRequest
       26

Java - проблема с classpath

2 голосов
/ 07 января 2012

У меня есть файл products.jar.Внутри этого есть один класс com.ClassA.Структура проекта выглядит следующим образом:

products
    |--test
        |--com
            |--ClassA.java
        |--dependencies
            |---inputs.txt

Внутри затмения ClassA.java обращается к файлу inputs.txt по следующему пути и работает нормально

private static final String PROPERTIES_FILE_PATH = "test/dependencies/inputs.txt";

testпакет находится в пути сборки java -> sources

Но когда я экспортирую этот проект как products.jar, я обнаружил, что в файле jar нет каталога test.В корне файла jar есть два каталога com и dependencies.Поэтому, когда я пытаюсь выполнить ClassA (находящийся в файле jar) через командную строку, я получаю следующее исключение:

JUnit version 4.8.2
java.io.FileNotFoundException: test/dependencies/inputs.txt (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:137)
at java.io.FileInputStream.<init>(FileInputStream.java:96)

Итак, обнаружив, что test dir не экспортируется вjar file, я изменил путь к файлу в моем ClassA.java на dependencies/inputs.txt.Он не работал в Eclipse, но я подумал, что он будет работать в JAR, потому что файл JAR находится в classpath, а папка dependencies находится в корне файла JAR, поэтому программа запуска Java сможет найти папку dependencies изатем inputs.txt файл.

Но, к сожалению, он также не работает.

Ответы [ 2 ]

6 голосов
/ 07 января 2012

Вы не можете использовать FileInputStream для чтения файла, упакованного в JAR - это больше не файл.FileInputStream работает только для реальных файлов на диске.

Вам необходимо прочитать ресурс, используя Class.getResourceAsStream ( javadoc ), например,

InputStream stream = getClass().getResourceAsStream("/dependencies/inputs.txt");

Вы не включаетеtest префикс, потому что его нет в файловой структуре JAR.

2 голосов
/ 07 января 2012

FileInputStream () не будет читать внутри вашего jar, только файлы в файловой системе. Используйте .getClass (). GetResourceAsStream (имя ресурса) или .getClass (). GetClassLoader (). GetResourceAsStream (resourcename)

Дополнительная информация о javadoc для класса getResourceAsStream и загрузчик классов getResourceAsStream ()

...