我需要log4j 1.2和2.5共存于同一webapp中

时间:2018-09-17 19:04:07

标签: java crystal-reports log4j classloader log4j2

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

除了使用Crystal之外,我别无选择,我们的组织已处于锁定状态。我只能选择回滚整个应用程序而不像其他所有应用程序那样使用log4j2.5,或者我需要找到一种它们可以共存的方式。当我将两个罐子都放在类路径中时,该应用程序往往对要加载的内容感到困惑,并且没有注销。删除那个罐子,伐木效果很好...但是水晶炸弹。

我真的不想将所有内容回滚到1.2。有没有办法使它们很好地共存?像仅在调用Crystal或其他方法时使classloader上的1.2更高?有人知道一些可以帮助我的窍门吗?

1 个答案:

答案 0 :(得分:0)

代理对象 proxy-object library

将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();

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