java - 执行JAR时如何从外部提供mysql主机到spring boot
问题描述
我有一个使用 MySQL 数据库的 java Spring boot 项目。我有以下application.properties
文件来指定 MySQL url、用户和密码:
spring.datasource.url=jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_NAME}
spring.datasource.username=${MYSQL_USER}
spring.datasource.password=${MYSQL_PASSWORD}
使用此属性文件,如果我编辑运行配置并在 Environment 选项卡中设置 、 、 和 的值并运行它,我可以从 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}"
...
这意味着它实际上并没有在运行时替换这些值。
我该如何解决?
编辑:我还尝试使用存档实用程序打开 jar 并看到application.properties
文件.. 它包含以下行:
spring.datasource.url=jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_NAME}
这意味着这些值应该在运行时更新。但它不是
解决方案
我最终能够通过添加一个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;
}
}
这允许您在运行时将数据源、用户名和密码从外部配置为 VM 参数。
值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
推荐阅读
- ios - 多次调用 ViewDidLoad 将 SwiftUI 调用到情节提要?
- typescript - 如何在打字稿中获取范围数数组
- vim - 如何在vimscript中将搜索结果作为列表获取?
- python - 根据条件在 Jupyter Notebook 中显示 DataFrame
- c - MbedTLS 和 .NET BouncyCastle 与 Curve25519 的互操作性问题
- python - Django显示在不同字段中上传文件
- powershell - 如何将文件夹移动到具有文件夹第一个字符名称的子文件夹中以支持文件夹名称中的 Unicode 字符?
- regex - 电子邮件标题的正则表达式并合并为单个表达式
- mysql - 如何使用现有代码在 SQL 工作台中创建数据库,然后在 R 中使用它?
- java - 更新字符串后如何获取字符串值