【问题标题】:Classloader load incorrect log4j.xml类加载器加载不正确的 log4j.xml
【发布时间】:2018-09-13 06:45:43
【问题描述】:

我有以下结构的 java maven 项目

AA.ear
|_ 库
    |_ parent_config.jar
       |_ log4j.xml
    |_ child_config.jar
       |_ log4j.xml [this is expeccted to load]
|_ BB.war


我正在使用 log4j 1.2。 parent_config.jar 是由 child_config.jar 继承的依赖项目。他们都有 log4j.xml。类加载器一直从 child_config.jar 读取 log4j.xml,但是自从升级到 Spring 4 后,它就不能按预期工作了。结果是从 parent_config.xml 加载 log4j.xml。

我尝试通过 7zip 从 parent_config.jar 中删除 log4j.xml,最后它按预期工作。此外,这里的限制是我应该像往常一样构建 parent_config.jar(不删除 log4j.xml),因为它也被其他项目使用。并排除使用WEB-INF/lib和-Dlog4j.configuration的方法

请问对这种情况有什么建议吗?

【问题讨论】:

    标签: java maven log4j


    【解决方案1】:

    在某些运行时环境中,可以控制类路径条目的顺序。但我不建议这样做。

    您应该提供一个自定义 log4j 配置文件,其名称与 log4j.xml 不同和/或不位于类路径根目录中,并通过系统属性 log4j.configuration 进行配置。

    【讨论】:

    • log4j.configutation 不太合适。我宁愿在应用程序中配置而不是在 vm 中配置。但即使使用这种方法,它也需要类路径 [com.aaa.bbb.ccc] 或外部位置 [file:////path/to/xml]。我应该如何通过 log4j.configuration 指向我的 log4j.xml 遵循我当前的项目结构?
    • 我故意不在上面的答案中表达自己的意见。从我的角度来看,提供日志配置和 JAR 文件(例如 API)并没有多大意义。您可以为您的应用程序提供默认配置。但即便如此,我还是会恳求不要使用默认名称和位置,并记录一个压倒一切的机制。简而言之:您无法选择这两个文件之一。使用类路径中的第一个。
    • 虽然没有打样,但相信是因为其他独立项目使用的parent_config.jar所以配置位于jar文件中。同意配置设置应该位于应用程序级别,因为它是基于 WEB 的项目。幸运的是,我设法通过更改文件名并引用 log4j.configuration 来“强制”类加载器读取正确的 log4j.xml。这可能是一个临时解决方案。仍在努力,谢谢 Frito!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多