Reading maven settings is not working with Jackson 2.18 in the classpath
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
Thanks for looking into it!
How do I override the version? Do I have to publish a new version of the build plugins?
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?
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.
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 !
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).
Thank yes not quite sure what changed to break that between those versions. Let us know if you land on a possible fix! 🙏🏻
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.