Как извне предоставить хост mysql для весенней загрузки при выполнении JAR

У меня есть загрузочный проект Java Spring, который использует базу данных MySQL. У меня есть следующий файл application.properties для указания URL-адреса MySQL, пользователя и пароля:

spring.datasource.url=jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_NAME}
spring.datasource.username=${MYSQL_USER}
spring.datasource.password=${MYSQL_PASSWORD}

Используя этот файл свойств, я могу запустить приложение из Eclipse, если отредактирую конфигурации запуска и установлю значения DB_HOST, DB_PORT, DB_NAME, MYSQL_USER и MYSQL_PASSWORD на вкладке «Среда» и запущу его.. все работает нормально.

Но теперь я хочу запустить его на сервере, создав JAR и передав эти значения из командной строки в Jar во время выполнения. Итак, я создал файл Jar следующим образом:

/gradlew clean build bootJar -DDB_HOST=mock -DDB_PORT=mock -DDB_NAME=mock \
-Dmysql_user=mock \
-Dmysql_password=mock

это успешно генерирует исполняемый файл Jar. Затем я пытаюсь запустить сгенерированный файл jar следующим образом:

java -jar build/libs/MyApplication.jar -Ddb_host=localhost \
-Ddb_port=3306 \
-Ddb_name=my_db \
-Dmysql_user=root \
-Dmysql_password=root

но выдает следующую ошибку:

...
Failed to parse the host:port pair '${DB_HOST}:${DB_PORT}'
...
java.lang.NumberFormatException: For input string: "${DB_PORT}"
...

Это означает, что он фактически не заменяет значения во время выполнения.

Как это исправить?

Редактировать: Я также попытался открыть банку с помощью архиватора и увидел файл application.properties.. он содержит следующую строку:

spring.datasource.url=jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_NAME}

это означает, что эти значения должны были быть обновлены во время выполнения. но это не

Просто не включайте эти записи в application.properties и не устанавливайте -Dspring.datasource.username напрямую. В случае сбоя проверьте, нужно ли вам помещать эти свойства перед предложением -jar.

chrylis -cautiouslyoptimistic- 07.03.2019 00:31

Попробовал это и попытался передать часть -D перед -jar тоже ... не сработало. На этот раз выдал ошибку: java.sql.SQLException: Access denied for user ''@'localhost' (using password: NO) Так вот, я думаю, что он вообще не взял эти значения из командной строки.

Sumit 07.03.2019 00:39

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

kTest 07.03.2019 00:49

Я думаю, что использование профилей конфигурации было бы лучшей практикой. затем запустите эти профили или введите их с помощью переменных среды (без ${..}) в ваших app.properties

Gewure 07.03.2019 02:38
db_host не то же самое, что DB_HOST. Используйте заглавные буквы в параметрах -D.
M. Deinum 07.03.2019 07:35

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

Sumit 07.03.2019 22:50

Вы пробовали передавать их в качестве аргументов вместо свойств? То есть вместо -D использовать --? --db_host=<hostame>.

M. Deinum 08.03.2019 09:48

Вы нашли решение для этого? У меня такая же проблема. Я вручную настроил источник данных с помощью @Bean, но когда я запускаю jar, это дает мне ошибку.

bharatpatel 23.01.2020 06:45

добавлено решение в качестве ответа ниже.

Sumit 24.01.2020 03:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
9
746
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В конце концов мне удалось заставить это работать, добавив класс DatasourceConfig и установив значения программно.

Я удалил все значения spring.datasource.* из моего файла application.property, а затем создал новый класс:

@Configuration
@EnableTransactionManagement
@PropertySource("classpath:application.properties")
public class DatasourceConfig {

  @Bean
  @Primary
  public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setUrl(System.getProperty("MYSQL_URL"));
    dataSource.setUsername(System.getProperty("MYSQL_USER"));
    dataSource.setPassword(System.getProperty("MYSQL_PASSWORD"));
    return dataSource;
  }

}

Это позволяет настроить источник данных, имя пользователя и пароль извне в качестве аргументов виртуальной машины во время выполнения.

Значения MYSQL_URL,MYSQL_USER,MYSQL_PASSWORD передаются команде gradle при сборке следующим образом:

./gradlew clean build bootJar -DMYSQL_URL=mock -DMYSQL_USER=mock -DMYSQL_PASSWORD=mock

, и аналогично команде java при запуске jar следующим образом:

java -jar build/libs/MyApplication.jar -DMYSQL_URL=jdbc:mysql://localhost:3306/my_db -DMYSQL_USER=root -DMYSQL_PASSWORD=root

Вам просто нужно выставить эти поля как переменные среды перед запуском jar.

Для Linux:

$ export DB_HOST=localhost
$ export DB_PORT=3306
$ export DB_NAME=my_db
$ export MYSQL_USER=root
$ export MYSQL_PASSWORD=root
$ java -jar build/libs/MyApplication.jar

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