Файл внешних свойств весенней загрузки в "текущем каталоге" игнорируется

из руководства:

24.3 Файлы свойств приложения SpringApplication загрузит свойства из файлов application.properties в следующих местах и ​​добавит их в среду Spring:

Подкаталог /config текущего каталога.

Текущий каталог

Пакет classpath /config

Корень пути к классам

Он дважды упоминает текущий каталог, но на самом деле это ничего не значит:

Я попытался положить его в корень моего проекта (т.е. выше src в папке, которая соответствует выводу java.io.File( "." ).getCanonicalPath() а также System.getProperty("user.dir");), и я попытался положить его с файлами войны (т.е. в build\libs)

Но единственное место, которое действительно работает, это местоположение по умолчанию (src\main\resources).

Так что же означает "текущий каталог" и куда на самом деле идут файлы?

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

Гиды говорят, что положить application.properties в текущем каталоге будет работать, и я нашел точный текущий каталог, чтобы вставить его, но он все еще не работает, что я могу проверить с помощью вывода: System.out.println(System.getProperty("spring.datasource.url")); который null Он выводит правильное значение только со встроенным файлом свойств.

5 ответов

Согласно ConfigFileApplicationListener:

// Note the order is from least to most specific (last one wins)
private static final String DEFAULT_SEARCH_LOCATIONS =
       "classpath:/,classpath:/config/,file:./,file:./config/";

file:./ перейдите в рабочий каталог, где вы запускаете процесс Java.

Я согласен с аргументом Стефана Николла о том, что нам, как правило, это не нужно для разработки и тестирования, но нужно для производства, где файл свойств, как правило, экстернализуется, а файл, присутствующий в исходном коде, не используется. Это то, что работает для меня,

java -jar myjar.jar --spring.config.location=file:D:\\RunRC\\application.properties

Справочник - D:\\RunRC - упомянутая выше команда является образцом с моей машины.

Я продолжаю использовать файл свойств исходного кода, т.е. \src\main\resources\ в разработке и тестировании, но в производстве, я закомментирую записи, и если я начинаю свою банку или войну с D:\\RunRC затем я предоставляю Current Directory, как показано выше в команде java, и сохраняю там файл свойств.

Просто делаю - @PropertySource({ "application.properties"}) или же @PropertySource({ "file:application.properties"}) не берет его из каталога, где хранятся баночка или война.

Для учетных данных базы данных я бы предложил использовать переменные среды, специфичные для ОС, и использовать синтаксис, аналогичный - @PropertySource({"file:${CONF_DIR}database.properties" }) где CONF_DIR существующая переменная окружения, указывающая на этот каталог.

Надеюсь, поможет!!

Если вы ищете "текущий каталог java", вы окажетесь здесь с этим вопросом. Предполагается, что если вы положите application.properties в том же каталоге, что и приложение, оно будет выбрано по умолчанию.

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

Я понимаю, что текущий каталог является корневым каталогом вашего проекта. Тем не менее, вы можете изменить это с -Dspring.config.location=your/config/dir/, Взгляните на этот пост введите описание ссылки здесь

Текущий каталог относится к тому, где мы выполняем нашу банку. Создание исполняемого jar с помощью плагина Spring Boot maven и размещение application.properties рядом с файлом jar будут работать. Пример: здесь

Другие вопросы по тегам