Spring Boot:在生产环境中未读取app.jar旁边的log4j2.xml

时间:2018-07-24 11:50:41

标签: spring-boot log4j2

我是Spring Boot的新手。

在“资源”下有2个文件:

-- resources
    -- application.properties
    -- log4j2.xml

在开发环境中,一切正常。

在生产环境中,我复制了两个文件并将它们放在app.jar旁边:

  -- app_folder
        -- my-app.jar
        -- application.properties
        -- log4j2.xml

当我启动my-app.jar时,:

    根据需要从app_folder中读取
  • application.properties
  • 从'resources'中读取
  • log4j2.xml,忽略app_folder下的那个

这不是开箱即用吗?我在做什么错了?

2 个答案:

答案 0 :(得分:0)

您为什么认为它可以那样工作?

诚然,根据其documentation,如果Spring Boot与jar文件位于同一目录中,它将正确检测application.properties

话虽如此,log4j2.xml不是由Spring Boot读取,而是由Log4J2 Framework读取,并且根据其documentation,该框架还可以在类路径中查找文件。

如果文件在其他位置,则需要指定如下路径:

java -Dlog4j.configurationFile=path/to/log4j2.xml -jar my-app.jar

编辑:

  

my-app.jar是可执行文件,因此启动my-app时不会调用'java'命令。

是的。即使您是从GUI调用(例如,在Windows中的资源管理器中双击),它仍然可以在后台运行java -jar my-app.jar

  

app.jar所在的类路径不是同一文件夹吗?

再次,你为什么会认为是这样?

在Java文档(对于Java 8为here,在Folders and Archive Files部分中,它明确指出,如果将类存储在jar中,则类路径仅包含jar中的内容(尽管以防万一)由于具有自定义类加载器,因此它还包含嵌入在jar中的jar,通常不是这种情况-参见Executable Jar Format

在尝试使用以前从未使用过的任何框架/库/编程语言之前,您确实应该阅读文档(或至少其中的相关部分),从长远来看,它将节省大量时间。

答案 1 :(得分:0)

我要做的就是放一个名为

的文件
name-of-my-spring-boot-jar-file.conf

与jar文件本身位于同一目录中。 conf文件的内容:

JAVA_OPTS="-Dlog4j.configurationFile=/home/<user>/log4j2.xml"