java - 如何在执行JAR时外部向spring boot提供mysql主机

标签 java mysql spring 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}

使用此属性文件,如果我编辑运行配置并设置 DB_HOSTDB_PORTDB_NAME 的值,我就可以从 Eclipse 运行应用程序code>、MYSQL_USERMYSQL_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 类并以编程方式设置值来使其正常工作。

我从 application.property 文件中删除了所有 spring.datasource.* 值,然后创建了一个新类:

@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_URLMYSQL_USERMYSQL_PASSWORD 在构建时传递到 gradle 命令,如下所示:

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

,与运行 jar 时的 java 命令类似:

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

关于java - 如何在执行JAR时外部向spring boot提供mysql主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55033750/

相关文章:

java - Insert 上没有写@CreatedDate 注释的字段,@LastModifiedDate 是

java - 通过 javax.swing.text.Element 从 JTextPane 获取一个组件?

java - Android 项目中带有 2 个字符串的 ListView/ListAdapter

java - 使用正则表达式从子字符串替换java中的一行

java - 使用 Java 反射动态创建 JSF 表单

mySQL 子查询 - 如果可能的话单次传递

javascript - 如何在没有html表单标签的情况下向数据库中插入数据

java - Spring EL - 拆分属性值并获取第二个条目

mysql-获取唯一电子邮件 ID 的值

java - Spring 任务