Загрузочный файл Spring / Maven из classpath - PullRequest
0 голосов
/ 01 ноября 2019

в моей папке ресурсов:

src/main/resources

У меня есть два файла: файл application.properties и файл JSON app.schema.json

У меня есть следующая функция:

private File loadSchema(String schemaName) throws JsonSchemaMissingException {
        ClassLoader classLoader = JsonSchemaValidator.class.getClassLoader();
        File file = new File(Objects.requireNonNull(classLoader.getResource("app.schema.json")).getFile());

        if (!file.exists()) {
            log.LogErrorWithTransactionId("", "file does not exist " + file.getAbsolutePath());
            throw new JsonSchemaMissingException("file does not exist");
        }
        return file;
    }

Если я запускаю mvn spring-boot:run, он успешно находит файл. Если я запускаю:

  • mvn package
  • java -jar app.jar

Я получаю NullPointer, поскольку следующий файл не существует:

/home/XXX/Docs/project/XXX/file:/home/ghovat/Docs/project/XXX/target/app.jar!/BOOT-INF/classes!/app.event.json

В моем pom.xml в сборке я добавил со следующими настройками и без них:

<resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>

Ни в коем случае это не работает. Он может получить доступ к файлу, если я запускаю mvn spring-boot:run, но также если я запускаю mvn clean package spring-boot:repackage и java -jar target/app.jar Он не находит файл.

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

Как мне сделать файл доступным?

Ответы [ 3 ]

1 голос
/ 01 ноября 2019

Можете ли вы проверить внутри jar, если он содержит упомянутый файл в папке классов. Также вы можете попробовать приведенный ниже код для загрузки файла из classpath.

Thread.currentThread().getContextClassLoader().getResource(<file_name>)

Если возможно, сохраните этот файл вне jar-файла в каком-либо месте папки и установите это местоположение как classpath при выполнении jar-файла.

1 голос
/ 01 ноября 2019

Вам необходимо включить каталог src/main/resources в classpath в вашем pom.xml, используя его относительный путь:

 <build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
 </build>

Подробнее об этом можно прочитать здесь .

0 голосов
/ 04 ноября 2019

Как упоминал Роперт Шолте, чтобы исправить это, я использовал Inputstream для загрузки, а не для загрузки в качестве файла. С помощью приведенного ниже кода я исправил его:

private Reader loadSchema(String schemaName) throws JsonSchemaMissingException {
    ClassLoader classLoader = JsonSchemaValidator.class.getClassLoader();
    InputStream fileStream = classLoader.getResourceAsStream(schemaName);

    if (fileStream == null) {
        log.LogErrorWithTransactionId("", "file does not exist ");
        throw new JsonSchemaMissingException("file does not exist");
    }
    Reader reader = new InputStreamReader(fileStream, StandardCharsets.UTF_8);
    return reader;
}

Обратите внимание, поскольку я использую файл для проверки схемы JSON, мне нужно было преобразовать Inputstream в объект чтения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...