Добавьте внешнюю конфигурацию в classpath и получите к ней доступ с помощью getResourcesAsStream () - PullRequest
3 голосов
/ 12 ноября 2019

У меня есть приложение, которое требует настройки при запуске. Однако я не могу сохранить это в / resources, так как каждая среда, в которой будет размещаться это приложение, будет совершенно другой. Сейчас я хочу добавить каталог из файловой системы в путь к классам - скажем, / tr / apps / (где / tr / apps / - это корень, в котором развернуто приложение).

Я нашел плагин Maven, который выглядел так, как будто бы он справился с работой: https://maven.apache.org/surefire/maven-surefire-plugin/examples/configuring-classpath.html

Итак, я добавил это в свой pom:

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M3</version>
        <configuration>
          <additionalClasspathElements>
            <additionalClasspathElement>/tr/apps</additionalClasspathElement>
          </additionalClasspathElements>
        </configuration>
      </plugin>
    </plugins>
  </build>

Теперь у меня есть , чтобы использовать следующий метод для получения файла:

InputStream inputStream = Thread.currentThread().getContextClassloader().getResourceAsStream("tr/apps/myFile.txt")
if(inputStream == null) {
    throw new Exception("myFile.txt not found");
}

Это исключение всегда создается (т.е. он не может найти файл в пути к классам). Кто-нибудь знает, почему это? Или, если есть альтернативный плагин / решение для этого?

Буду очень признателен за любой вклад!

1 Ответ

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

maven-surefire-plugin используется для выполнения модульных тестов, а ресурсы, добавленные в путь к классам с использованием additionalClasspathElement, доступны только во время фазы test в Maven. (т.е. вы не можете использовать эти файлы в вашем реальном коде приложения, кроме ваших модульных тестов).

Обновление: Я не уверен, применимо ли к вам это решение, но возможный обходной путь / решение состоит в том, чтобы передать местоположение файла в качестве аргумента JVM, а затем с помощью FileInputStream прочитать файл.

Пример: передайте аргумент jvm как -Dexternal.config.file.path=/Users/Documents/my-app-config.properties и в своем коде java прочитайте файл.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class ConfigFileReader {

    private static final Logger logger = LogManager.getLogger(ConfigFileReader.class);

    public static void readConfigFile() {

        String configFilePath = System.getProperty("external.config.file.path");
        try (InputStream inputStream = new FileInputStream(new File(configFilePath))) {
            // Do your stuff
        } catch (FileNotFoundException e) {
            logger.error("{} File not found", configFilePath);
        } catch (IOException e) {
            logger.error("IOException occurred while reading {}", configFilePath);
        }
    }

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