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

标签 java spring spring-boot tomcat log4j2

我的 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/

相关文章:

java - 在 Selenium 中找不到确切的文本

java - jaxb编码跳过空元素

java - 将 Spring Cloud 负载均衡与 KeycloakRestTemplate 集成

java - Spring 自定义事件:how to raise an event whenever a property values changed in spring bean

spring - 使用两个端口配置 Spring Boot

Java Spring boot 和 Travis CI

java - Android R 在 Ubuntu 中无法解决

java - 缺少工件 javax.transaction :jta:jar:1. 0.1B(问题不同,因为您可能会看到分辨率不同)

java - Spring MVC @RequestMapping 参数问题

java - 使用 Spring Boot 与 Kotlin 和 Java 有什么区别?