如何在执行JAR时从外部为mysql主机提供Spring Boot

时间:2019-03-06 23:21:35

标签: java mysql spring spring-boot

我有一个使用MySQL数据库的java Spring引导项目。我有以下application.properties文件用于指定MySQL网址,用户名和密码:

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

如果编辑运行配置并设置DB_HOSTDB_PORTDB_NAMEMYSQL_USERMYSQL_PASSWORD的值,则可以使用此属性文件从Eclipse运行应用程序。 /gradlew clean build bootJar -DDB_HOST=mock -DDB_PORT=mock -DDB_NAME=mock \ -Dmysql_user=mock \ -Dmysql_password=mock 在“环境”标签中并运行它。.一切正常。

但是现在我想在服务器上运行它,方法是生成一个JAR并将这些值在运行时从命令行传递给Jar。因此,我创建了一个Jar文件,如下所示:

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

这成功生成了可执行的Jar文件。然后,我尝试像这样运行生成的jar文件:

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

但是会出现以下错误:

application.properties

这意味着它实际上不是在运行时替换值。

我该如何解决?

编辑:我还尝试使用存档工具打开jar,并看到spring.datasource.url=jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_NAME}文件。它包含以下行:

{{1}}

这意味着这些值应该在运行时更新。但这不是

2 个答案:

答案 0 :(得分:0)

我最终可以通过添加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_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

答案 1 :(得分:0)

您只需要在运行 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