Linux Spring启动应用程序无法读取环境属性

Linux Spring启动应用程序无法读取环境属性,linux,spring,spring-boot,tomcat,environment-variables,Linux,Spring,Spring Boot,Tomcat,Environment Variables,我有一个Spring Boot应用程序,其中我正在为yml文件使用环境属性 我的application.yml如下所示: spring: datasource: url: ${DB_URL} driver-class-name: ${DB_DRIVER} username: ${DB_USERNAME} password: ${DB_PASSWORD} connectionTestQuery: SELECT 1 FROM DUAL max-wa

我有一个Spring Boot应用程序,其中我正在为
yml
文件使用环境属性

我的
application.yml
如下所示:

spring:
  datasource:
    url: ${DB_URL}
    driver-class-name: ${DB_DRIVER}
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
    connectionTestQuery: SELECT 1 FROM DUAL
    max-wait: ${database.max-wait:5000}
    max-active: ${database.max-active:500}
    test-on-borrow: ${database.test-on-borrow:true}
    initialization-mode: always
#!/bin/bash
export DB_DRIVER=com.mysql.cj.jdbc.Driver
export DB_PASSWORD=XXXXXX
export DB_URL=jdbc:mysql://XX.XX.XX.XX:3306/XXXXX
export DB_USER=XXXXXX
当我试图通过Tomcat将其部署到外部主机时,应用程序无法启动,因为它无法读取环境变量。 我得到以下错误

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker': Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.UncategorizedScriptException: Failed to execute database script; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Access denied for user '${DB_USERNAME}'@'localhost' (using password: YES)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1794)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516)
            at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324)
            at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)
            at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322)
            at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:227)
            at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1175)
            at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:420)
            at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:350)
            at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:343)
            at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerPostProcessor.postProcessAfterInitialization(DataSourceInitializerPostProcessor.java:52)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:430)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)
            ... 134 more
我使用的是Ubuntu服务器。我将环境变量设置为
/etc/environment
,它们如下所示

DB_URL="jdbc:mysql://XX.XX.XX.XX:3306/XXXXX"
DB_USER="XXXXX"
DB_PASSWORD="XXXXX"
DB_DRIVER="com.mysql.cj.jdbc.Driver"
当我运行命令
set
时,它们完美地显示在那里。 我还尝试在
/opt/tomcat/bin
下创建一个
setenv.sh
文件,如下所示:

spring:
  datasource:
    url: ${DB_URL}
    driver-class-name: ${DB_DRIVER}
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
    connectionTestQuery: SELECT 1 FROM DUAL
    max-wait: ${database.max-wait:5000}
    max-active: ${database.max-active:500}
    test-on-borrow: ${database.test-on-borrow:true}
    initialization-mode: always
#!/bin/bash
export DB_DRIVER=com.mysql.cj.jdbc.Driver
export DB_PASSWORD=XXXXXX
export DB_URL=jdbc:mysql://XX.XX.XX.XX:3306/XXXXX
export DB_USER=XXXXXX
我还没有尝试在概要文件中这样做,因为根据这个线程,使用
/etc/environment
应该足够了:


知道我遗漏了什么吗?

可能是您输入了错误的凭据。只需使用一些MySql GUI工具(如workbench、SQLYG等)交叉检查相同的凭证即可。

您可以使用
spring.config.location
为外部化配置文件设置显式路径。然后,您可以配置Spring引导应用程序,以便在启动时将它们作为系统属性加载

比如说

Properties props = new Properties();
props.setProperty("spring.config.location",<your config file path>);
Properties=newproperties();
setProperty(“spring.config.location”,);

来源:

在您正在使用的spring引导属性文件中

${DB_USERNAME}

在您正在使用的bash配置文件中

导出DB_用户=XXXXXX

将bash文件更改为

导出${DB_USERNAME}=XXXXXX


您是否确保tomcat可以访问您的
setenv.sh
?还设置了
CATALINA_基地
CATALINA_家园
?参考:@Sajjad我在
/etc/environments
中添加了
CATALINA_HOME
,并且
setenv.sh
具有读取和执行权限。还有什么要做的吗?是的,我做了,正如您在异常中看到的,它使用的是yml中环境变量的纯文本。但是我的问题不是配置文件的位置,我希望避免将其外部化。我希望能够让spring引导读取环境变量。