我正在开发一个Java Web应用程序,在EAR中打包为WAR,它利用Log4j2进行日志记录,在将应用程序部署到开发服务器时遇到问题。日志记录依赖于一个自定义过滤器(基于this答案),位于单独的JAR中,用于设置每个客户端的日志级别。
在我的本地计算机上,特别是当EAR通过IDE运行时,过滤器被加载(Took 0.x seconds to load 1 plugins from package a.b.c
)并按预期工作。在通过管理控制台手动导出和加载的开发服务器和本地计算机上,未加载过滤器(Took 0.x seconds to load 0 plugins from package a.b.c
),因此日志记录无法正常运行。
EAR布局看起来大致如下:
.
├── lib
| ├── Common.jar
| | ├── CustomFilter.class
| | └── OtherCustomUtils.class
| ├── log4j-api.jar
| ├── log4j-core.jar
| └── [more third party JARs]
├── WebApp.war
| ├── WebApp.class
| └── WEB-INF
| ├── lib
| | ├── log4j-web.jar
| | └── [more third party JARs]
| ├── log4j2.xml
| └── web.xml
├── SomeEJB.jar
| └── ClassThatAlsoUsesCommonJar.class
└── META-INF
└── application.xml
我的假设是,在初始化和配置Log4j2之前,Common.jar中的类根本没有被类加载器加载。这是我到目前为止所尝试的内容:
我承认我的假设完全取决于我的应用服务器并没有急切地加载EAR的lib目录中所有JAR中的所有类。
基于配置的简单修复将是理想的选择。在制作JEE应用程序时,我仍然是最好的新手,所以我不会惊讶于找到一个隐藏在某处的选项,以明确指定Common.jar中的所有内容都被预加载(假设它不是&#39已经?)
实际的代码更改当然不是不可能的。我只是不愿意。