如何创建一个 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'
…
}
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'
…
}