В общем, причина, по которой библиотеки журналов имеют 2 JAR (как в представленном примере), состоит в том, чтобы позволить библиотекам скомпилировать только для API JAR библиотеки, а затем работать (выполнить ) в время выполнения с фактической реализацией библиотеки журналирования (это будет log4j-core
в вашем случае), присутствующей где-то на пути к классу приложения-потребителя .
Имея это в виду, вы должны разделить зависимости между библиотекой и приложением, то есть в build.gradle
библиотеки вы должны иметь это:
dependencies {
implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.13.0'
// Note: you do not need the 'actual' implementation of Log4j in your library
// at all! It should compile very well with just the API, you'll then have
// to put an 'implementation' dependency on log4j-core in your consuming
// application's build.gradle (or pom.xml for that matter)
}
И затем в pom вашего приложения. xml вам нужно будет указать это:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.13.0</version>
</dependency>
Если вы хотите оставить все как есть (настоятельно рекомендуется не ) и включить зависимости от библиотеки для включения в приложение-потребитель затем используйте конфигурацию зависимостей api
вместо implementation
. Вот хороший ответ StackOverflow, объясняющий разницу между этими двумя .
В качестве примечания я бы предложил сделать вашу библиотеку зависимой не от API Log4j, а от Simple Logging Фасад для Java один, потому что тогда приложение-потребитель может выбирать, какую из реализаций библиотек журналов использовать. Как указано в FAQ по SLF4J :
[...] библиотеки и другие встроенные компоненты должны учитывать SLF4J для своих потребностей ведения журналов, поскольку библиотеки не могут позволить себе навязывать свой выбор среды ведения журналов конечный пользователь.
Примечание: Что бы вы ни выбрали, не используйте compile
конфигурацию зависимостей в скрипте сборки Gradle, потому что она устарела некоторое время go и может не работать с будущими версиями Gradle. Конфигурация, приблизительно эквивалентная compile
, равна api
.