rewrite icon indicating copy to clipboard operation
rewrite copied to clipboard

Reading maven settings is not working with Jackson 2.18 in the classpath

Open ammachado opened this issue 1 year ago • 8 comments

What version of OpenRewrite are you using?

I am using

  • OpenRewrite v8.42.0
  • Maven/Gradle plugin v5.47.0
  • rewrite-java-17 v8.42.0

How are you running OpenRewrite?

I am using the Maven plugin via CLI, and my project is a single module project.

What is the smallest, simplest way to reproduce the problem?

I have a custom set of recipes. When Jackson 2.18.2 is present on the classpath, I get the following error while running the existing recipe tests:

java.lang.AssertionError: Failed to parse sources or run recipe
        at org.openrewrite.test.RewriteTest.lambda$defaultExecutionContext$14(RewriteTest.java:636)
        at org.openrewrite.maven.MavenSettings.parse(MavenSettings.java:104)
        at org.openrewrite.maven.MavenSettings.parse(MavenSettings.java:110)
        at org.openrewrite.maven.MavenSettings.lambda$readMavenSettingsFromDisk$1(MavenSettings.java:123)
        at java.base/java.util.Optional.map(Optional.java:260)
        at org.openrewrite.maven.MavenSettings.readMavenSettingsFromDisk(MavenSettings.java:123)
        at org.openrewrite.maven.Assertions.customizeExecutionContext(Assertions.java:41)
        at org.openrewrite.internal.ThrowingConsumer.accept(ThrowingConsumer.java:26)
        at org.openrewrite.test.RewriteTest.rewriteRun(RewriteTest.java:217)
        at org.openrewrite.test.RewriteTest.rewriteRun(RewriteTest.java:132)
        at org.openrewrite.test.RewriteTest.rewriteRun(RewriteTest.java:127)
        at com.redhat.recipe.maven.ChangePropertiesTest.testPomPropertiesTest(ChangePropertiesTest.java:20)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
Caused by: java.io.IOException: Failed to parse C:\Users\ammachado\.m2\settings.xml
        ... 14 more
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Invalid definition for property 'httpHeaders' (of type `org.openrewrite.maven.MavenSettings$ServerConfiguration`): Could not find creator property with name 'httpHeaders' (known Creator properties: [property, timeout])
 at [Source: (org.openrewrite.internal.EncodingDetectingInputStream); line: 2, column: 1]

The maven settings.xml file is the following:

<?xml version="1.0" encoding="UTF-8"?>
<settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <mirrors>
    <mirror>
      <mirrorOf>*,!maven-snapshot-repos</mirrorOf>
      <id>maven-release-repos</id>
      <name>maven-release-repos</name>
      <url>https://repo.example.com/artifactory/maven-release-repos/</url>
    </mirror>
  </mirrors>
  <pluginGroups>
    <pluginGroup>org.openrewrite.maven</pluginGroup>
  </pluginGroups>
  <profiles>
    <profile>
      <id>artifactory</id>
      <repositories>
        <repository>
          <id>maven-release-repos</id>
          <name>maven-release-repos</name>
          <url>https://repo.example.com/artifactory/maven-release-repos/</url>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
        <repository>
          <id>maven-snapshot-repos</id>
          <name>maven-snapshot-repos</name>
          <url>https://repo.example.com/artifactory/maven-snapshot-repos/</url>
          <releases>
            <enabled>false</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
      </repositories>
    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>artifactory</activeProfile>
  </activeProfiles>
</settings>

What did you expect to see?

No execution errors.

What did you see instead?

The beforementioned exception.

What is the full stack trace of any errors you encountered?

java.lang.AssertionError: Failed to parse sources or run recipe
        at org.openrewrite.test.RewriteTest.lambda$defaultExecutionContext$14(RewriteTest.java:636)
        at org.openrewrite.maven.MavenSettings.parse(MavenSettings.java:104)
        at org.openrewrite.maven.MavenSettings.parse(MavenSettings.java:110)
        at org.openrewrite.maven.MavenSettings.lambda$readMavenSettingsFromDisk$1(MavenSettings.java:123)
        at java.base/java.util.Optional.map(Optional.java:260)
        at org.openrewrite.maven.MavenSettings.readMavenSettingsFromDisk(MavenSettings.java:123)
        at org.openrewrite.maven.Assertions.customizeExecutionContext(Assertions.java:41)
        at org.openrewrite.internal.ThrowingConsumer.accept(ThrowingConsumer.java:26)
        at org.openrewrite.test.RewriteTest.rewriteRun(RewriteTest.java:217)
        at org.openrewrite.test.RewriteTest.rewriteRun(RewriteTest.java:132)
        at org.openrewrite.test.RewriteTest.rewriteRun(RewriteTest.java:127)
        at com.redhat.recipe.maven.RemoveEarProjectsTest.test(RemoveEarProjectsTest.java:113)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
Caused by: java.io.IOException: Failed to parse C:\Users\ammachado\.m2\settings.xml
        ... 14 more
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Invalid definition for property 'httpHeaders' (of type `org.openrewrite.maven.MavenSettings$ServerConfiguration`): Could not find creator property with name 'httpHeaders' (known Creator properties: [property, timeout])
 at [Source: (org.openrewrite.internal.EncodingDetectingInputStream); line: 2, column: 1]
        at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:62)
        at com.fasterxml.jackson.databind.DeserializationContext.reportBadPropertyDefinition(DeserializationContext.java:1883)
        at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.addBeanProps(BeanDeserializerFactory.java:636)
        at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:277)
        at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:151)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:471)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:415)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:317)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:284)
        at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:174)
        at com.fasterxml.jackson.databind.DeserializationContext.findNonContextualValueDeserializer(DeserializationContext.java:659)
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:552)
        at com.fasterxml.jackson.databind.deser.std.DelegatingDeserializer.resolve(DelegatingDeserializer.java:60)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:347)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:284)
        at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:174)
        at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:636)
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.createContextual(CollectionDeserializer.java:190)
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.createContextual(CollectionDeserializer.java:30)
        at com.fasterxml.jackson.databind.DeserializationContext.handlePrimaryContextualization(DeserializationContext.java:851)
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:563)
        at com.fasterxml.jackson.databind.deser.std.DelegatingDeserializer.resolve(DelegatingDeserializer.java:60)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:347)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:284)
        at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:174)
        at com.fasterxml.jackson.databind.DeserializationContext.findNonContextualValueDeserializer(DeserializationContext.java:659)
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:552)
        at com.fasterxml.jackson.databind.deser.std.DelegatingDeserializer.resolve(DelegatingDeserializer.java:60)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:347)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:284)
        at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:174)
        at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:669)
        at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:5048)
        at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4918)
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3897)
        at org.openrewrite.maven.MavenSettings.parse(MavenSettings.java:102)

Are you interested in [contributing a fix to OpenRewrite]

Yes

ammachado avatar Dec 19 '24 18:12 ammachado

Thanks for looking into it!

timtebeek avatar Dec 19 '24 19:12 timtebeek

How do I override the version? Do I have to publish a new version of the build plugins?

ammachado avatar Dec 19 '24 20:12 ammachado

Good question! I've never looked into that part before; I do indeed see a reference here in the build plugin that you likely also saw: https://github.com/openrewrite/rewrite-build-gradle-plugin/blob/a6a7fd4ef41b0e123df09bc036a20c697b8cc485/src/main/java/org/openrewrite/gradle/RewriteJavaPlugin.java#L78 https://github.com/openrewrite/rewrite-build-gradle-plugin/blob/a6a7fd4ef41b0e123df09bc036a20c697b8cc485/src/main/java/org/openrewrite/gradle/RewriteJavaPlugin.java#L39-L40

Overriding that and installing it locally seems like the way to go.

Once we're closer to a fix I wonder if it makes sense to just bump the version to 2.18.+ going forward. Any thoughts to that?

timtebeek avatar Dec 19 '24 23:12 timtebeek

This issue is stale because it has not had any activity for 60 days. Remove question label or comment or this will be closed in two weeks. Issues may be reopened when there is renewed interest.

github-actions[bot] avatar Jul 28 '25 11:07 github-actions[bot]

There is something strange as Jackson only find such properties

Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Invalid definition for property 'httpHeaders' (of type `org.openrewrite.maven.MavenSettings$ServerConfiguration`): Could not find creator property with name 'httpHeaders' (known Creator properties: [property, timeout])
 at [Source: (org.openrewrite.internal.EncodingDetectingInputStream); line: 1, column: 1]
        at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:62)
        at com.fasterxml.jackson.databind.DeserializationContext.reportBadPropertyDefinition(DeserializationContext.java:1910)
        at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.addBeanProps(BeanDeserializerFactory.java:644)
        at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:278)
        at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:152)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:472)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:416)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:318)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:285)
        at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:175)
        at com.fasterxml.jackson.databind.DeserializationContext.findNonContextualValueDeserializer(DeserializationContext.java:659)
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:555)
        at com.fasterxml.jackson.databind.deser.std.DelegatingDeserializer.resolve(DelegatingDeserializer.java:60)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:348)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:285)
        at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:175)
        at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:636)
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.createContextual(CollectionDeserializer.java:189)
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.createContextual(CollectionDeserializer.java:29)
        at com.fasterxml.jackson.databind.DeserializationContext.handlePrimaryContextualization(DeserializationContext.java:864)
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:566)
        at com.fasterxml.jackson.databind.deser.std.DelegatingDeserializer.resolve(DelegatingDeserializer.java:60)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:348)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:285)
        at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:175)
        at com.fasterxml.jackson.databind.DeserializationContext.findNonContextualValueDeserializer(DeserializationContext.java:659)
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:555)
        at com.fasterxml.jackson.databind.deser.std.DelegatingDeserializer.resolve(DelegatingDeserializer.java:60)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:348)
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:285)
        at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:175)
        at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:669)
        at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:5102)
        at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4972)
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3924)
        at org.openrewrite.maven.MavenSettings.parse(MavenSettings.java:89)

when it parses such a XML Settings

<server>
                        <id>maven-snapshots</id>
                        <configuration>
                            <httpHeaders>
                                <property>
                                    <name>X-JFrog-Art-Api</name>
                                    <value>myApiToken</value>
                                </property>
                            </httpHeaders>
                        </configuration>
                    </server>

So this code is processed in a different way between 2.17 and 2.19

    @SuppressWarnings("DefaultAnnotationParam")
    @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
    @Data
    @With
    @JsonIgnoreProperties("httpHeaders")
    public static class ServerConfiguration {
        @JacksonXmlProperty(localName = "property")
        @JacksonXmlElementWrapper(localName = "httpHeaders", useWrapping = true)
        // wrapping is disabled by default on MavenXmlMapper
        @Nullable
        List<HttpHeader> httpHeaders;

        /**
         * Timeout in milliseconds for reading connecting to and reading from the connection.
         */
        @Nullable
        Long timeout;
    }

Tip: A temporary workaround is to do this mv $HOME/.m2/settings.xml $HOME/.m2/settings.xml.bk as commenting the <servers> don't fix the issue !

cmoulliard avatar Oct 10 '25 10:10 cmoulliard

I did some tests and I can reproduce the error with a simple test case using either jackson 2.17.2 (OK) or 2.19.2 (NOK).

cmoulliard avatar Oct 10 '25 13:10 cmoulliard

Thank yes not quite sure what changed to break that between those versions. Let us know if you land on a possible fix! 🙏🏻

timtebeek avatar Oct 13 '25 09:10 timtebeek

This is what worked for us:

afterEvaluate {
    configurations.testRuntimeClasspath {
        resolutionStrategy {
            eachDependency {
                if (requested.group.startsWith("com.fasterxml.jackson")) {
                    useVersion("2.17.2")
                    because("https://github.com/openrewrite/rewrite/issues/4803")
                }
            }
        }
    }
}

Unfortunately, this wasn't enough. Debugging deeper and deeper I catched a java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlElement, so you also need javax.xml.bind:jaxb-api in the test runtime classpath.

I expect this is only an issue with RewriteTests, since the OpenRewrite build plugins should have a classpath isolated from that of the host application.

alvarosanchez avatar Oct 16 '25 15:10 alvarosanchez