Файл внешних свойств весенней загрузки в "текущем каталоге" игнорируется
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 будут работать. Пример: здесь