Мне нужно, чтобы log4j 1.2 и 2.5 сосуществовали в одном веб-приложении. - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть Java-приложение, которое использует среду выполнения Business Objects Crystal для запуска отчета, закодированного в этой технологии. Проблема в том, что обезьяны в Crystal напрямую ссылались на метод в классе log4j 1.2. Этот метод не является частью API моста log4j 1.2-2.5. И не должно быть, потому что Кристалл не должен вызывать его напрямую.

У меня нет иного выбора, кроме как использовать Crystal, наша организация на нем заперта. Я могу только откатить все приложение, чтобы НЕ использовать log4j2.5, как все другие наши приложения, ИЛИ мне нужно найти способ, которым они могут сосуществовать. Когда я помещаю оба jar-файла в classpath, приложение запутывается в том, что загружать, и мы не выходим из системы. Удалите эту банку, и логирование отлично работает ... но Хрустальные бомбы.

Я действительно не хочу откатывать все обратно до 1.2. Есть ли способ заставить их сосуществовать красиво? Как сделать 1.2 выше на загрузчике классов только при вызове Crystal или что-то? Кто-нибудь знает какой-нибудь трюк, который может помочь мне здесь?

1 Ответ

0 голосов
/ 21 сентября 2018

прокси-объект библиотека прокси-объектов

Поместите 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();

Прокси-объектная библиотека будет обрабатывать отдельный беспорядок загрузчика классов, и вы должны иметь возможностьзагрузить любые конфликтующие зависимости таким образом.

...