Log4j2: Как убедить его в том, что классы log4j-core.jar действительно присутствуют? - PullRequest
0 голосов
/ 08 апреля 2020

Я собираю приложение Java в один исполняемый файл .jar, так что я распаковываю все необходимые файлы jar, от которых зависит приложение, и включаю все их содержимое вместе с файлами классов реального приложения в один файл .jar ( это IMHO очень удобная особенность задачи jar classi c. Тогда не нужно обрабатывать или распространять несколько jar-файлов, ни вложенные jars-файлы или что-либо подобное.)

До сих пор этот подход работал нормально, но теперь я обновился с log4j (v1) до log4j2 (на самом деле я использую slf4j-API, но версия log4j изменилась).

После этого обновления мой подход больше не работает, но во время выполнения я продолжаю получая сообщение об ошибке: ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console....

Однако все файлы классов log4j-core-version.jar включены в мой файл .jar! Очевидно, какой-то фрагмент кода пытается проверить наличие исходного файла .jar (и не понимает, что содержащиеся классы действительно присутствуют и в пути к классам), а затем выкрикивает.

Я использую log4j- slf4j-impl-2.13.1.jar, slf4j-api-1.7.25.jar, log4j-api-2.13.1.jar и log4j-core-2.13.1.jar (точнее - как описано - только их содержимое, не фактические файлы .jars).

Есть ли способ избежать этого и сообщить регистрационному коду, чтобы он не беспокоился. наличие этого .jar? Я не хотел бы иметь дело и всегда должен распространять два файла .jar только из-за этого.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Сразу после отправки моего вопроса у меня внезапно возникло подозрение: может быть, код, который проверяет наличие log4j-core, проверяет что-либо в MANIFEST-папке jar!?! Первоначально я всегда исключал копирование всей папки META-INF включенных .jars в сгенерированный новый файл all-in-one.jar. Теперь я исключаю только фактический файл MANIFEST.MF из включенных .jars и - удивление, удивление - теперь код log4j работает и больше не жалуется. Я не проверял , какой файл имел значение, но, очевидно, эти дополнительные файлы были оставлены в виде магического c заклинания (теперь есть каталог под названием "services" и еще один, называемый "версиями" с несколькими файлы каждый в объединенном .jar, а также кучу файлов pom и Log4j2Plugins.dat).

0 голосов
/ 08 апреля 2020

Jar-файлы содержат больше, чем просто классы. Они также могут содержать ресурсы. Система плагинов Log4j 2 использует файл для идентификации всех плагинов в jar, а java .util.ServiceLoader использует файл для идентификации всех реализаций службы. Без этих файлов все разбивается.

Предполагая, что вы используете плагин оттенка Maven, вам нужно использовать log4j преобразователь шейдов для распознавания плагинов и ServicesResourceTransformer .

...