我的 Spring Boot 应用程序(2.1.1.RELEASE)在 Debian 9 系统下以 WAR 形式部署在 Tomcat 8.5 服务器中。它使用以下文件来配置应用程序:
- myApplication.properties(Spring 的主要配置文件)
- log4j2.xml
两者都在 src/main/resources
下。
我的问题是关于如何以允许我拥有包含这两个文件的目录 /home/oliver/conf
的方式配置 Tomcat 和 Spring Boot,以便覆盖默认值在 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
添加到 JAVA_OPTS 定义在 /etc/default/tomcat8
,它可以工作(正确覆盖嵌入文件),但是例如,如果我尝试将 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 的类路径中?
编辑:
作为旁注,/home/oliver/conf
下可能有各种需要考虑的文件,例如 log4j2.xml + myApplication.properties + keystore.jks 所以我不确定我是否可以依赖 -Dspring.config.location
和 - Dlogging.config
完全。
最佳答案
我从你的问题中了解到你正在尝试做这样的事情。
-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 启动时加载。
关于java - Tomcat 8.5中部署的Spring Boot如何使用外部配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53857285/