Файл внешних свойств весенней загрузки - PullRequest
1 голос
/ 17 апреля 2020

Я пытаюсь запустить приложение java8, используя весеннюю загрузку версии 2.2.4. Затем приложение упаковывается в изображение docker.

Способ запуска моего приложения, как указано в Dockerfile, который заканчивается следующим образом:

FROM openjdk:8
.....
CMD /usr/local/openjdk-8/bin/java -jar -Dspring.config.location=/opt/$APP/ /opt/$APP/$APP.jar

Проблема, с которой я сталкиваюсь, заключается в загрузке внешних файлов свойств. Например, у меня есть файл application.properties, похожий на этот, который упакован внутри JAR :

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=db1
application.queue.sqs.queue_name=somesqs 

Кроме того, я также добавляю изображение docker с добавлением application.properties файл находится по адресу /opt/myapp/. Этот внешний файл похож на этот:

spring.data.mongodb.uri=mongodb://username:password@MONGO_URL:27017/db_name
application.queue.sqs.queue_name=another_sqs

Ожидаемое поведение : приложение будет загружать как новое местоположение another_sqs, так и внешнее соединение mon go .

Тем не менее, Фактическое поведение : при чтении журналов я вижу, что t новый sqs url (т.е. another_sqs) загружен правильно, хотя новое значение для mon go соединение отбрасывается и поэтому использует локальный встроенный механизм mon go.

Я проконсультировался в следующем посте по stackoverflow, чтобы попытаться понять, что я испытываю:

Spring Boot и несколько внешних файлов конфигурации

Но для моего понимания, при использовании Spring 2.X и выше, -Dspring.config.location должен переопределять все остальные файлы свойств ,

Вот где я начал отладку:

TRY 1: я подключил в docker контейнер, cd в /opt/$APP/, где оба app.jar и application.properties расположены, выполнили следующую команду java -jar app.jar и альт - работает ! Соединение с внешним источником mon go установлено. Это может быть объяснено приоритетом файлов свойств весенней загрузки, как указано в документах .

TRY для Spring: прикрепите контейнер, cd в $HOME/, выполните java -jar /opt/$APP/app.jar -Dspring.config.location=/opt/$APP/ - не подключиться к внешнему пн go, однако подключается к another_sqs. Странная вещь - загружается только часть значений application.properties? Разве Spring 1.X не работает, добавляя значение из нескольких файлов?

ПОПРОБОВАТЬ 3: Присоединить контейнер, cd к $HOME/, выполнить java -jar /opt/$APP/app.jar -Dspring.config.location=file:/opt/$APP/applicartion.properties - такое же поведение.

Попробуйте 4: отредактированный Dockerfile включает следующее выполнение:

CMD usr/local/openjdk-8/bin/java -jar -Dspring.config.location=classpath:/application.properties,file:/opt/$APP/application.properties /opt/$APP/$APP-$VER.jar

и снова работает . И another_sqs, и внешний пн go загружаются правильно при «Попытке 4».

Поэтому у меня такой вопрос:

Почему я должен явно указывать classpath:/application.proeprties? Разве -Dspring.config.location=/opt/$APP/ или -Dspring.config.location=file:/opt/$APP/application.properties не должно быть достаточно?

1 Ответ

2 голосов
/ 17 апреля 2020

Когда вы указываете -Dspring.config.location=file:/opt/$APP/application.properties, вы переопределяете значение по умолчанию config.location со своими application.properties. Если вы хотите использовать другой файл application.properties, но по-прежнему использовать свойства по умолчанию, не объявляя их, вы должны использовать

-Dspring.config.additional-location=file:/opt/$APP/application.properties

Таким образом, файл config.location по-прежнему будет иметь значение по умолчанию, и вы загрузите внешний свойства как дополнительное местоположение.

Из документации Spring :

Вы также можете сослаться на явное местоположение, используя свойство среды spring.config.location ( который представляет собой разделенный запятыми список каталогов или путей к файлам). Когда настраиваемые местоположения конфигурации настраиваются с помощью using spring.config.location, они заменяют местоположения по умолчанию

В качестве альтернативы, когда настраиваемые местоположения конфигурации настраиваются с помощью spring.config.additional-location, они используются в дополнение к стандартному местоположения.

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