在JEE Web应用程序

时间:2016-08-31 16:16:04

标签: java-ee plugins log4j2 ear

背景

我正在开发一个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和网络模块的类加载器之间的冲突;我认为通过将部署的EAR配置为仅对整个应用程序使用一个类加载器来消除这种可能性,但我可能是错的。
    • 从那以后我就离开了EAR。希望这不会搞砸所有事情。
  • 我目前正在使用log4j-web,正如" Using Log4j 2 In Web Applications"页。使用最少的配置,我发现它在启动Web应用程序后几乎立即运行并加载log4j2.xml。在IDE中运行时,我认为Common.jar已经加载,所以这没关系,在开发服务器上(或在本地手动安装),Common.jar似乎还没有加载,并且搜索插件失败了。
    • 删除log4j2-web并让log4j2在第一次调用时初始化自己似乎无法解决此问题(首次调用log4j2发生在首次调用Common.jar中的任何类之前)
    • 日志会转到几个文件和数据库,因此我不认为我希望此应用程序在没有 log4j-web的情况下运行
  • 承认log4j-web是一个Web片段,我想尝试将Common.jar作为Web片段,并指定它通过Web应用程序中的web.xml在log4j-web之前加载。我接下来不知道我在这做什么,所以我可能搞砸了。此外,这需要Common.jar在WEB-INF / lib中,这可能是也可能不是什么大问题?
    • EJB项目依赖于Common.jar,因此它需要加载它,但由于我在整个应用程序中使用一个类加载器,我假设如果Web应用程序首先加载它,那么EJB需要它以后,它已经在那里?

我承认我的假设完全取决于我的应用服务器并没有急切地加载EAR的lib目录中所有JAR中的所有类。


期望的解决方案

基于配置的简单修复将是理想的选择。在制作JEE应用程序时,我仍然是最好的新手,所以我不会惊讶于找到一个隐藏在某处的选项,以明确指定Common.jar中的所有内容都被预加载(假设它不是&#39已经?)

实际的代码更改当然不是不可能的。我只是不愿意。


环境

  • Java版本:1.7.1
  • JEE版本:6
  • Log4j2版本:2.6.2
  • Application Server:WebSphere 8.5.5.6
  • IDE:Rational Software Architect 8.5(Eclipse 3.6?)


类似问题

0 个答案:

没有答案