如何创建一个 Java 库来打包我们所有的微服务都可以使用的 log4j?

How to create a Java library that packs log4j that all our microservices can then use?

Gradle v7.3.3。 (注意,我不是 Java 程序员,但我理解 Gradle。)

与许多公司一样,我们也遇到了 Log4j 漏洞。为了缓解这种情况,我们将所有微服务的 build.gradle 文件更新为当时最新的 log4j v2.16.0

dependencies {
    implementation ('org.apache.logging.log4j:log4j-api') {
        version {
            strictly '[2.16.0]'
        }
    }
    implementation ('org.apache.logging.log4j:log4j-core') {
        version {
            strictly '[2.16.0]'
        }
    }
    ...
}

但随后他们在 v2.16.0 中发现了漏洞,因此我们必须通过相同的练习来更新所有或我们的 build.gradle 文件以使用 log4j v2.17.0。我读到我们可能不得不再次这样做?

我如何创建依赖于最新 log4j 版本的库或插件,然后我们的微服务就可以像这样依赖?

dependencies {
    implementation ('com.mycompany.log4j:company-log4j:2.+')
}

那么我们的内部 log4j 库将用这个代替吗?

dependencies {
    implementation ('org.apache.logging.log4j:log4j-api') {
        version {
            strictly '[2.17.0]'
        }
    }
    implementation ('org.apache.logging.log4j:log4j-core') {
        version {
            strictly '[2.17.0]'
        }
    }
    ...
}

我用这段代码创建了一个简单的 Java 库

/*
 * This Java source file was generated by the Gradle 'init' task.
 */
package com.company.log4j;

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;

public class Library {
    private static Logger log = LogManager.getLogger(Library.class.getName());

    public boolean someLibraryMethod() {
        log.info("This is an INFO level log message!");
        log.error("This is an ERROR level log message!");
        return true;
    }
}

它确实构建了,但是当我解压缩 JAR 文件时,我没有看到 log4j 工件?

您可以创建一个 gradle platform project to bundle common dependencies such as log4j. The project will produce a maven BOM (bill of material) that can be handled like a usual maven artifact and can easily be imported with gradle。其他项目只是依赖于平台项目,可以继续使用log4j,一旦平台需要更新版本,就会使用更新版本。

在您的项目中,仍然声明了对 log4j 的依赖项,但没有版本信息。所需的版本通过 platform/BOM.

提供

logging-dependencies/build.gradle:

plugins {
  id 'java-platform'
}

dependencies {
  constraints {
    api group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.17.0'
    api group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.17.0'
  }
}

project-xyz/build.gradle:

dependencies {
    implementation platform(group: 'my.company.dependencies', name: 'logging-dependencies', version: '2.+')

    implementation group: 'org.apache.logging.log4j', name: 'log4j-api'
    implementation group: 'org.apache.logging.log4j', name: 'log4j-core'
    …
}