This is an automated email from the ASF dual-hosted git repository.

pkarwasz pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/main by this push:
     new 4e44a28112 Upgrade Jackson from 2.x to 3.0.0 (#3701)
4e44a28112 is described below

commit 4e44a2811206d66fcd4dc6f3db1eff1629c9a404
Author: Kurt Ostfeld <[email protected]>
AuthorDate: Tue Oct 7 03:39:54 2025 -0500

    Upgrade Jackson from 2.x to 3.0.0 (#3701)
    
    Upgraded Jackson from 2.x to 3.0.0
---
 log4j-config-jackson/pom.xml                       |  2 +-
 .../jackson/AbstractJacksonConfiguration.java      | 26 +++++-----------
 log4j-config-properties/pom.xml                    |  2 +-
 .../config/properties/JavaPropsConfiguration.java  |  6 ++--
 log4j-config-yaml/pom.xml                          |  2 +-
 .../log4j/config/yaml/YamlConfiguration.java       |  9 ++----
 log4j-core-test/pom.xml                            | 16 +++++++---
 log4j-docker/pom.xml                               |  9 ++----
 .../apache/logging/log4j/docker/DockerLookup.java  | 35 ++++++++++++----------
 log4j-layout-template-json-test/pom.xml            |  2 ++
 .../log4j/layout/template/json/JacksonFixture.java |  2 +-
 .../template/json/JsonTemplateLayoutTest.java      |  6 ++--
 log4j-parent/pom.xml                               |  7 +++--
 log4j-perf-test/pom.xml                            |  4 +--
 .../.3.x.x/update_tools_jackson_jackson_bom.xml    |  8 +++++
 15 files changed, 70 insertions(+), 66 deletions(-)

diff --git a/log4j-config-jackson/pom.xml b/log4j-config-jackson/pom.xml
index ab2125febe..aee9dd1387 100644
--- a/log4j-config-jackson/pom.xml
+++ b/log4j-config-jackson/pom.xml
@@ -36,7 +36,7 @@
     </dependency>
 
     <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
+      <groupId>tools.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
     </dependency>
 
diff --git 
a/log4j-config-jackson/src/main/java/org/apache/logging/log4j/config/jackson/AbstractJacksonConfiguration.java
 
b/log4j-config-jackson/src/main/java/org/apache/logging/log4j/config/jackson/AbstractJacksonConfiguration.java
index b6fc2c3cd9..c8ce6666f9 100644
--- 
a/log4j-config-jackson/src/main/java/org/apache/logging/log4j/config/jackson/AbstractJacksonConfiguration.java
+++ 
b/log4j-config-jackson/src/main/java/org/apache/logging/log4j/config/jackson/AbstractJacksonConfiguration.java
@@ -16,18 +16,12 @@
  */
 package org.apache.logging.log4j.config.jackson;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.JsonNodeFactory;
-import com.fasterxml.jackson.databind.node.ObjectNode;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.TreeMap;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.config.AbstractConfiguration;
@@ -38,6 +32,10 @@ import org.apache.logging.log4j.core.config.Reconfigurable;
 import org.apache.logging.log4j.core.config.status.StatusConfiguration;
 import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.model.PluginType;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.node.JsonNodeFactory;
+import tools.jackson.databind.node.ObjectNode;
 
 /**
  * Base class for all Jackson-based configurations.
@@ -116,10 +114,8 @@ public abstract class AbstractJacksonConfiguration extends 
AbstractConfiguration
 
     @Override
     public void setup() {
-        final Iterator<Entry<String, JsonNode>> iter = root.fields();
         final List<Node> children = rootNode.getChildren();
-        while (iter.hasNext()) {
-            final Map.Entry<String, JsonNode> entry = iter.next();
+        for (Map.Entry<String, JsonNode> entry : root.properties()) {
             final JsonNode n = entry.getValue();
             if (n.isObject()) {
                 LOGGER.debug("Processing node for object {}", entry.getKey());
@@ -154,10 +150,8 @@ public abstract class AbstractJacksonConfiguration extends 
AbstractConfiguration
         final PluginType<?> type = corePlugins.get(getType(jsonNode, name));
         final Node node = new Node(parent, name, type);
         processAttributes(node, jsonNode);
-        final Iterator<Map.Entry<String, JsonNode>> iter = jsonNode.fields();
         final List<Node> children = node.getChildren();
-        while (iter.hasNext()) {
-            final Map.Entry<String, JsonNode> entry = iter.next();
+        for (Map.Entry<String, JsonNode> entry : jsonNode.properties()) {
             final JsonNode n = entry.getValue();
             if (n.isArray() || n.isObject()) {
                 if (type == null) {
@@ -195,9 +189,7 @@ public abstract class AbstractJacksonConfiguration extends 
AbstractConfiguration
     }
 
     private String getType(final JsonNode node, final String name) {
-        final Iterator<Map.Entry<String, JsonNode>> iter = node.fields();
-        while (iter.hasNext()) {
-            final Map.Entry<String, JsonNode> entry = iter.next();
+        for (Map.Entry<String, JsonNode> entry : node.properties()) {
             if ("type".equalsIgnoreCase(entry.getKey())) {
                 final JsonNode n = entry.getValue();
                 if (n.isValueNode()) {
@@ -210,9 +202,7 @@ public abstract class AbstractJacksonConfiguration extends 
AbstractConfiguration
 
     private void processAttributes(final Node parent, final JsonNode node) {
         final Map<String, String> attrs = parent.getAttributes();
-        final Iterator<Map.Entry<String, JsonNode>> iter = node.fields();
-        while (iter.hasNext()) {
-            final Map.Entry<String, JsonNode> entry = iter.next();
+        for (Map.Entry<String, JsonNode> entry : node.properties()) {
             if (!"type".equalsIgnoreCase(entry.getKey())) {
                 final JsonNode n = entry.getValue();
                 if (n.isValueNode()) {
diff --git a/log4j-config-properties/pom.xml b/log4j-config-properties/pom.xml
index 14a6a5691c..f8602487ee 100644
--- a/log4j-config-properties/pom.xml
+++ b/log4j-config-properties/pom.xml
@@ -38,7 +38,7 @@
     </dependency>
 
     <dependency>
-      <groupId>com.fasterxml.jackson.dataformat</groupId>
+      <groupId>tools.jackson.dataformat</groupId>
       <artifactId>jackson-dataformat-properties</artifactId>
     </dependency>
 
diff --git 
a/log4j-config-properties/src/main/java/org/apache/logging/log4j/config/properties/JavaPropsConfiguration.java
 
b/log4j-config-properties/src/main/java/org/apache/logging/log4j/config/properties/JavaPropsConfiguration.java
index 92d16ff690..c89d5562c6 100644
--- 
a/log4j-config-properties/src/main/java/org/apache/logging/log4j/config/properties/JavaPropsConfiguration.java
+++ 
b/log4j-config-properties/src/main/java/org/apache/logging/log4j/config/properties/JavaPropsConfiguration.java
@@ -16,13 +16,12 @@
  */
 package org.apache.logging.log4j.config.properties;
 
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.javaprop.JavaPropsMapper;
 import org.apache.logging.log4j.config.jackson.AbstractJacksonConfiguration;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.ConfigurationSource;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.dataformat.javaprop.JavaPropsMapper;
 
 /**
  * Creates a Node hierarchy from a properties file.
@@ -41,7 +40,6 @@ public class JavaPropsConfiguration extends 
AbstractJacksonConfiguration {
 
     protected ObjectMapper getObjectMapper() {
         return JavaPropsMapper.builder()
-                .configure(JsonParser.Feature.ALLOW_COMMENTS, true)
                 .nodeFactory(SortingNodeFactory.INSTANCE)
                 .build();
     }
diff --git a/log4j-config-yaml/pom.xml b/log4j-config-yaml/pom.xml
index 8b02dd275d..b6f7f56e97 100644
--- a/log4j-config-yaml/pom.xml
+++ b/log4j-config-yaml/pom.xml
@@ -38,7 +38,7 @@
     </dependency>
 
     <dependency>
-      <groupId>com.fasterxml.jackson.dataformat</groupId>
+      <groupId>tools.jackson.dataformat</groupId>
       <artifactId>jackson-dataformat-yaml</artifactId>
     </dependency>
 
diff --git 
a/log4j-config-yaml/src/main/java/org/apache/logging/log4j/config/yaml/YamlConfiguration.java
 
b/log4j-config-yaml/src/main/java/org/apache/logging/log4j/config/yaml/YamlConfiguration.java
index 0deff0b9dd..bbc79fd414 100644
--- 
a/log4j-config-yaml/src/main/java/org/apache/logging/log4j/config/yaml/YamlConfiguration.java
+++ 
b/log4j-config-yaml/src/main/java/org/apache/logging/log4j/config/yaml/YamlConfiguration.java
@@ -16,13 +16,12 @@
  */
 package org.apache.logging.log4j.config.yaml;
 
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
 import org.apache.logging.log4j.config.jackson.AbstractJacksonConfiguration;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.ConfigurationSource;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.dataformat.yaml.YAMLMapper;
 
 /**
  * Creates a Node hierarchy from a YAML file.
@@ -41,8 +40,6 @@ public class YamlConfiguration extends 
AbstractJacksonConfiguration {
 
     @Override
     protected ObjectMapper getObjectMapper() {
-        return YAMLMapper.builder()
-                .configure(JsonParser.Feature.ALLOW_COMMENTS, true)
-                .build();
+        return YAMLMapper.builder().build();
     }
 }
diff --git a/log4j-core-test/pom.xml b/log4j-core-test/pom.xml
index 5b9744f862..545a2d98a7 100644
--- a/log4j-core-test/pom.xml
+++ b/log4j-core-test/pom.xml
@@ -156,28 +156,28 @@
 
     <!-- Required for JSON support -->
     <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
+      <groupId>tools.jackson.core</groupId>
       <artifactId>jackson-core</artifactId>
       <optional>true</optional>
     </dependency>
 
     <!-- Required for JSON support -->
     <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
+      <groupId>tools.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
       <optional>true</optional>
     </dependency>
 
     <!-- Required for XML layout and receiver support -->
     <dependency>
-      <groupId>com.fasterxml.jackson.dataformat</groupId>
+      <groupId>tools.jackson.dataformat</groupId>
       <artifactId>jackson-dataformat-xml</artifactId>
       <optional>true</optional>
     </dependency>
 
     <!-- Required for YAML support (including JSON requirements) -->
     <dependency>
-      <groupId>com.fasterxml.jackson.dataformat</groupId>
+      <groupId>tools.jackson.dataformat</groupId>
       <artifactId>jackson-dataformat-yaml</artifactId>
       <optional>true</optional>
     </dependency>
@@ -315,6 +315,14 @@
       <scope>test</scope>
     </dependency>
 
+    <!-- Needed by wiremock for testing -->
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <version>${jackson2.test.version}</version>
+      <scope>test</scope>
+    </dependency>
+
     <dependency>
       <groupId>org.xmlunit</groupId>
       <artifactId>xmlunit-core</artifactId>
diff --git a/log4j-docker/pom.xml b/log4j-docker/pom.xml
index 2b6c19f09e..6234d39419 100644
--- a/log4j-docker/pom.xml
+++ b/log4j-docker/pom.xml
@@ -36,11 +36,6 @@
     <!--
       ~ OSGi and JPMS options
       -->
-    <bnd-extra-module-options>
-      <!-- Non detected module names -->
-      com.fasterxml.jackson.core;substitute="jackson-core",
-      com.fasterxml.jackson.databind;substitute="jackson-databind"
-    </bnd-extra-module-options>
     <Fragment-Host>org.apache.logging.log4j.core</Fragment-Host>
   </properties>
 
@@ -59,11 +54,11 @@
       <artifactId>jackson-annotations</artifactId>
     </dependency>
     <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
+      <groupId>tools.jackson.core</groupId>
       <artifactId>jackson-core</artifactId>
     </dependency>
     <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
+      <groupId>tools.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
     </dependency>
     <dependency>
diff --git 
a/log4j-docker/src/main/java/org/apache/logging/log4j/docker/DockerLookup.java 
b/log4j-docker/src/main/java/org/apache/logging/log4j/docker/DockerLookup.java
index d9f0f42dac..d9f92c83cc 100644
--- 
a/log4j-docker/src/main/java/org/apache/logging/log4j/docker/DockerLookup.java
+++ 
b/log4j-docker/src/main/java/org/apache/logging/log4j/docker/DockerLookup.java
@@ -16,9 +16,8 @@
  */
 package org.apache.logging.log4j.docker;
 
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.IOException;
+import java.io.InputStream;
 import java.net.URI;
 import java.net.URL;
 import java.util.List;
@@ -33,6 +32,8 @@ import org.apache.logging.log4j.docker.model.Network;
 import org.apache.logging.log4j.kit.env.PropertyEnvironment;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.status.StatusLogger;
+import tools.jackson.core.type.TypeReference;
+import tools.jackson.databind.json.JsonMapper;
 
 /**
  * Looks up keys for a Docker container.
@@ -62,24 +63,26 @@ public class DockerLookup extends AbstractLookup {
             final URL url = baseUri.resolve("/containers/json").toURL();
             if (url.getProtocol().equals(HTTP)) {
                 final String macAddr = NetUtils.getMacAddressString();
-                final ObjectMapper objectMapper = new ObjectMapper();
-                final List<Container> containerList = 
objectMapper.readValue(url, new TypeReference<>() {});
+                final JsonMapper jsonMapper = new JsonMapper();
+                try (InputStream urlStream = url.openStream()) {
+                    final List<Container> containerList = 
jsonMapper.readValue(urlStream, new TypeReference<>() {});
 
-                for (final Container container : containerList) {
-                    if (macAddr != null && container.getNetworkSettings() != 
null) {
-                        final Map<String, Network> networks =
-                                container.getNetworkSettings().getNetworks();
-                        if (networks != null) {
-                            for (final Network network : networks.values()) {
-                                if (macAddr.equals(network.getMacAddress())) {
-                                    current = container;
-                                    break;
+                    for (final Container container : containerList) {
+                        if (macAddr != null && container.getNetworkSettings() 
!= null) {
+                            final Map<String, Network> networks =
+                                    
container.getNetworkSettings().getNetworks();
+                            if (networks != null) {
+                                for (final Network network : 
networks.values()) {
+                                    if 
(macAddr.equals(network.getMacAddress())) {
+                                        current = container;
+                                        break;
+                                    }
                                 }
                             }
                         }
-                    }
-                    if (current != null) {
-                        break;
+                        if (current != null) {
+                            break;
+                        }
                     }
                 }
             }
diff --git a/log4j-layout-template-json-test/pom.xml 
b/log4j-layout-template-json-test/pom.xml
index 0eaaedf87f..e7dd53bb68 100644
--- a/log4j-layout-template-json-test/pom.xml
+++ b/log4j-layout-template-json-test/pom.xml
@@ -97,9 +97,11 @@
       <scope>test</scope>
     </dependency>
 
+    <!-- Needed by elasticsearch-java for testing -->
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
+      <version>${jackson2.test.version}</version>
       <scope>test</scope>
     </dependency>
 
diff --git 
a/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JacksonFixture.java
 
b/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JacksonFixture.java
index aa518c5702..82b919127c 100644
--- 
a/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JacksonFixture.java
+++ 
b/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JacksonFixture.java
@@ -16,7 +16,7 @@
  */
 package org.apache.logging.log4j.layout.template.json;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
+import tools.jackson.databind.ObjectMapper;
 
 public final class JacksonFixture {
 
diff --git 
a/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutTest.java
 
b/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutTest.java
index 662de8be5f..ebaf948ebb 100644
--- 
a/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutTest.java
+++ 
b/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutTest.java
@@ -24,9 +24,6 @@ import static 
org.apache.logging.log4j.layout.template.json.TestHelpers.writeJso
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.MappingIterator;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.ByteArrayOutputStream;
 import java.io.EOFException;
 import java.io.IOException;
@@ -83,6 +80,9 @@ import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginFactory;
 import org.junit.jupiter.api.Test;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.MappingIterator;
+import tools.jackson.databind.ObjectMapper;
 
 @SuppressWarnings("DoubleBraceInitialization")
 class JsonTemplateLayoutTest {
diff --git a/log4j-parent/pom.xml b/log4j-parent/pom.xml
index bdcb31f28c..a9c423c9d9 100644
--- a/log4j-parent/pom.xml
+++ b/log4j-parent/pom.xml
@@ -111,7 +111,10 @@
     <hamcrest.version>3.0</hamcrest.version>
     <HdrHistogram.version>2.2.2</HdrHistogram.version>
     <hsqldb.version>2.7.4</hsqldb.version>
-    <jackson-bom.version>2.20.0</jackson-bom.version>
+    <!-- wiremock and elasticsearch-java libraries used for testing require 
Jackson 2 -->
+    <!-- The log4j project is using Jackson 3. -->
+    <jackson2.test.version>2.20.0</jackson2.test.version>
+    <jackson-bom.version>3.0.0</jackson-bom.version>
     <javax-jms.version>2.0.1</javax-jms.version>
     
<java-allocation-instrumenter.version>3.3.4</java-allocation-instrumenter.version>
     <jctools.version>4.0.5</jctools.version>
@@ -200,7 +203,7 @@
       </dependency>
 
       <dependency>
-        <groupId>com.fasterxml.jackson</groupId>
+        <groupId>tools.jackson</groupId>
         <artifactId>jackson-bom</artifactId>
         <version>${jackson-bom.version}</version>
         <type>pom</type>
diff --git a/log4j-perf-test/pom.xml b/log4j-perf-test/pom.xml
index 0fed2e3aec..2803d4ca53 100644
--- a/log4j-perf-test/pom.xml
+++ b/log4j-perf-test/pom.xml
@@ -145,13 +145,13 @@
     </dependency>
 
     <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
+      <groupId>tools.jackson.core</groupId>
       <artifactId>jackson-core</artifactId>
       <optional>true</optional>
     </dependency>
 
     <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
+      <groupId>tools.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
       <optional>true</optional>
     </dependency>
diff --git a/src/changelog/.3.x.x/update_tools_jackson_jackson_bom.xml 
b/src/changelog/.3.x.x/update_tools_jackson_jackson_bom.xml
new file mode 100644
index 0000000000..3825f635d5
--- /dev/null
+++ b/src/changelog/.3.x.x/update_tools_jackson_jackson_bom.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       xmlns="https://logging.apache.org/xml/ns";
+       xsi:schemaLocation="https://logging.apache.org/xml/ns 
https://logging.apache.org/xml/ns/log4j-changelog-0.xsd";
+       type="updated">
+    <issue id="3701" 
link="https://github.com/apache/logging-log4j2/pull/3701"/>
+    <description format="asciidoc">Update from Jackson 2.x to Jackson 
3.0.0</description>
+</entry>

Reply via email to