如何通过Tomcat 8.5中部署的Spring Boot使用外部配置文件

时间:2018-12-19 18:33:55

标签: java spring spring-boot tomcat log4j2

我的Spring Boot应用程序(2.1.1.RELEASE)作为WAR部署在Debian 9系统下的Tomcat 8.5服务器中。除其他外,它使用以下文件来配置应用程序:

  • myApplication.properties(Spring的主要配置文件)
  • log4j2.xml

两者都在src/main/resources下。

我的问题是有关如何配置Tomcat和Spring Boot的方式,该方式允许我拥有包含两个文件的目录/home/oliver/conf,以便覆盖src/main/resources下定义的默认值(然后放在爆炸的WAR中的WEB-INF/classes中)。

下面是我采取的步骤。

首先,作为我正在从事的项目的要求,我通过编辑/etc/init.d/tomcat8将默认的Tomcat基本目录更改为指向另一个位置:

CATALINA_HOME=/usr/share/tomcat8
CATALINA_BASE=/home/oliver

我的/home/oliver/conf文件夹,其中包含Tomcat和Spring配置,如下所示:

- Catalina/
- context.xml
- web.xml
- server.xml
- ...
- myApplication.properties
- log4j2.xml
- otherAppConfFile.properties
- ...

由于默认情况下Spring会查找application.properties,因此我使用 @PropertySource 批注指定另一个文件:

@SpringBootApplication
@PropertySource({classpath: myApplication.properties})
public class MyApp extends SpringBootServletInitializer {...}

我尝试将-Dspring.config.location=file:/home/oliver/conf/myApplication.properties添加到/etc/default/tomcat8中定义的 JAVA_OPTS 中,并且可以正常工作(正确覆盖嵌入式文件),但是例如,如果我尝试添加file:/etc/oliver/conf/log4j2.xml到先前的JVM参数,它不起作用。

我读过一些有关Spring的“环境配置文件”,但不希望使用它们。

当我启动Tomcat并发出ps aux | grep tomcat命令时,我看到了所有JAVA_OPTS参数均按预期定义,并且还看到了以下内容:

-classpath :/home/oliver/conf:/usr/share/tomcat8/bin/.... -Dcatalina.base=/home/oliver -Dcatalina.home=/usr/share/tomcat8

我对Tomcat的类路径和Spring的关联方式以及应该如何解决此问题感到困惑。

如果我在启动时看到的类路径包含/home/oliver/conf目录,为什么其中的文件没有覆盖嵌入式属性文件(myApplication.properties,log4j2.xml ...)?是否可以看到该文件夹​​并将其添加到Spring的classpath中?

编辑:

请注意,/home/oliver/conf下可能需要考虑各种文件,例如 log4j2.xml + myApplication.properties < / strong> + keystore.jks ,所以我不确定我是否可以完全依靠-Dspring.config.location-Dlogging.config

1 个答案:

答案 0 :(得分:1)

我从您的问题中了解到,您正在尝试执行类似的操作。

-Dspring.config.location=file:/etc/oliver/conf/log4j2.xml

我认为属性spring.config.location是提供用于配置的属性文件的位置,而不是log4j2.xml。 您可以通过设置logging.config的值来设置myApplication.properties中日志文件的位置,例如

logging.config=file:/etc/oliver/conf/log4j2.xml

否则,您可以尝试

-Dlogging.config=file:/etc/oliver/conf/log4j2.xml

更新

这就是我在生产系统中所做的。创建文件setenv.sh并输入以下命令。

export JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.trustStore=/path/to/keystore/keystore.jks -Djavax.net.ssl.trustStorePassword=changeit -Dspring.profiles.active=qa -Dspring.config.location=/path/to/config/ -Dfws_log=/path/to/logfile/location -Xms512m -Xmx1024m -Dsecret.key=somesecretkey"

您可以在此文件中添加任意数量的键值映射,并且所有这些键值映射将在您的tomcat启动时加载。