我需要 log4j 1.2 和 2.5 共存于同一个 web 应用程序中

2024-04-13

我有一个 java web 应用程序,它使用 Crystal 的 Business Objects 运行时来运行以该技术编码的报告。问题在于 Crystal 的猴子直接引用了 log4j 1.2 类中的方法。此方法不是 log4j 1.2 到 2.5 桥接 API 的一部分。也不应该是因为 Crystal 不应该直接调用它。

我别无选择,只能使用水晶,我们的组织已经锁定它了。我只能选择回滚整个应用程序而不像我们所有其他应用程序一样使用 log4j2.5,或者我需要找到一种它们可以共存的方法。当我将两个 jar 放入类路径中时,应用程序往往会混淆要加载的内容,并且我们无法注销。移除那个罐子,日志记录效果很好......但是水晶炸弹。

我真的不想把一切都回滚到 1.2。有没有办法让它们很好地共存?就像只有在调用 Crystal 或其他东西时才在类加载器上使 1.2 更高?有人知道一些可以帮助我的技巧吗?


代理对象 代理对象库 https://github.com/avinokurov/proxy-object/blob/master/README.md#proxy-object

将 Crystal jar 及其所有依赖项放在文件夹中(/path/to/crystalLib/)

代码示例

从 Crystal 库创建任何类:

    File libDir = new File("/path/to/crystalLib/");

    ProxyCallerInterface caller = ObjectBuilder.builder()
            .setClassName("org.crystal.report")
            .setArtifact(DirArtifact.builder()
                    .withClazz(this.getClass())
                    .withVersionInfo(newVersionInfo(libDir))
                    .build())
            .build();
    String version = caller.call("crystalMethod").asString();

代理对象库将处理单独的类加载器混乱,您应该能够通过这种方式加载任何冲突的依赖项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我需要 log4j 1.2 和 2.5 共存于同一个 web 应用程序中 的相关文章

随机推荐