alexa / alexa-skills-kit-sdk-for-java

The Alexa Skills Kit SDK for Java helps you get a skill up and running quickly, letting you focus on skill logic instead of boilerplate code.
http://developer.amazon.com/ask
Apache License 2.0
818 stars 748 forks source link

“NoSuchMethodErrors” due to multiple versions of com.fasterxml.jackson.core:jackson-core:jar #262

Closed Bing-ok closed 3 years ago

Bing-ok commented 4 years ago

Hi, there are multiple versions of com.fasterxml.jackson.core:jackson-core in alexa-skills-kit-sdk-for-java-2.30.1(aws-sdk module). As shown in the following dependency tree, according to Maven's “nearest wins” strategy, only com.fasterxml.jackson.core:jackson-core:2.10.4 can be loaded, and com.fasterxml.jackson.core:jackson-core:2.6.7 will be shadowed.

As com.fasterxml.jackson.core:jackson-core:2.6.7 has not been loaded during the building process, several methods are missing. However, the missing methods: 1. com.fasterxml.jackson.core.base.GeneratorBase: com.fasterxml.jackson.core.json.JsonWriteContext getOutputContext()

Check for details of invocation

paths------
<com.amazon.ask.module.StandardSdkModule$Builder: com.amazon.ask.module.StandardSdkModule build()> alexa-skills-kit-sdk-for-java-2.30.1\ask-sdk\target\classes
<com.amazon.ask.attributes.persistence.impl.DynamoDbPersistenceAdapter$Builder: com.amazon.ask.attributes.persistence.impl.DynamoDbPersistenceAdapter build()> Repositories\com\amazon\alexa\ask-sdk-dynamodb-persistence-adapter\2.30.1\ask-sdk-dynamodb-persistence-adapter-2.30.1.jar
<com.amazon.ask.attributes.persistence.impl.DynamoDbPersistenceAdapter: void init (com.amazon.ask.attributes.persistence.impl.DynamoDbPersistenceAdapter$Builder,com.amazon.ask.attributes.persistence.impl.DynamoDbPersistenceAdapter$1)> Repositories\com\amazon\alexa\ask-sdk-dynamodb-persistence-adapter\2.30.1\ask-sdk-dynamodb-persistence-adapter-2.30.1.jar
<com.amazon.ask.attributes.persistence.impl.DynamoDbPersistenceAdapter: void init (com.amazon.ask.attributes.persistence.impl.DynamoDbPersistenceAdapter$Builder)> Repositories\com\amazon\alexa\ask-sdk-dynamodb-persistence-adapter\2.30.1\ask-sdk-dynamodb-persistence-adapter-2.30.1.jar
<com.amazon.ask.attributes.persistence.impl.DynamoDbPersistenceAdapter: void autoCreateTableIfNotExists()> Repositories\com\amazon\alexa\ask-sdk-dynamodb-persistence-adapter\2.30.1\ask-sdk-dynamodb-persistence-adapter-2.30.1.jar
<com.amazonaws.services.dynamodbv2.util.TableUtils: boolean createTableIfNotExists(com.amazonaws.services.dynamodbv2.AmazonDynamoDB,com.amazonaws.services.dynamodbv2.model.CreateTableRequest)> Repositories\com\amazonaws\aws-java-sdk-dynamodb\1.11.420\aws-java-sdk-dynamodb-1.11.420.jar
<com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient: com.amazonaws.services.dynamodbv2.model.CreateTableResult createTable(com.amazonaws.services.dynamodbv2.model.CreateTableRequest)> Repositories\com\amazonaws\aws-java-sdk-dynamodb\1.11.420\aws-java-sdk-dynamodb-1.11.420.jar
<com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient: com.amazonaws.services.dynamodbv2.model.CreateTableResult executeCreateTable(com.amazonaws.services.dynamodbv2.model.CreateTableRequest)> Repositories\com\amazonaws\aws-java-sdk-dynamodb\1.11.420\aws-java-sdk-dynamodb-1.11.420.jar
<com.amazonaws.services.dynamodbv2.model.transform.CreateTableRequestProtocolMarshaller: com.amazonaws.Request marshall(com.amazonaws.services.dynamodbv2.model.CreateTableRequest)> Repositories\com\amazonaws\aws-java-sdk-dynamodb\1.11.420\aws-java-sdk-dynamodb-1.11.420.jar
<com.amazonaws.protocol.json.internal.JsonProtocolMarshaller: com.amazonaws.Request finishMarshalling()> Repositories\com\amazonaws\aws-java-sdk-core\1.11.420\aws-java-sdk-core-1.11.420.jar
<com.amazonaws.protocol.json.SdkJsonGenerator: byte[] getBytes()> Repositories\com\amazonaws\aws-java-sdk-core\1.11.420\aws-java-sdk-core-1.11.420.jar
<com.amazonaws.protocol.json.SdkJsonGenerator: void close()> Repositories\com\amazonaws\aws-java-sdk-core\1.11.420\aws-java-sdk-core-1.11.420.jar
<com.fasterxml.jackson.dataformat.cbor.CBORGenerator: void close()> Repositories\com\fasterxml\jackson\dataformat\jackson-dataformat-cbor\2.6.7\jackson-dataformat-cbor-2.6.7.jar
<com.fasterxml.jackson.core.base.GeneratorBase: com.fasterxml.jackson.core.json.JsonWriteContext getOutputContext()>

The above missing methods are actually referenced by alexa-skills-kit-sdk-for-java-2.30.1(aws-sdk module), which will cause “NoSuchMethodErrors” at runtime.

Suggested fixing solutions:

  1. Declare direct dependency com.fasterxml.jackson.core:jackson-core to 2.6.7
  2. Use <exclude> to exclude com.fasterxml.jackson.core:jackson-core:2.10.4 from the dependency tree
  3. Use configuration attribute <dependencyManagement> to unify the version of library com.fasterxml.jackson.core:jackson-core to be 2.6.7 in alexa-skills-kit-sdk-for-java-2.30.1(aws-sdk module)'s pom file.

Please let me know which solution do you prefer? I can submit a PR to fix it.

Thank you very much for your attention. Best regards,

Dependency tree----

click for details

[INFO] com.amazon.alexa:ask-sdk:jar:2.30.1
[INFO] +- com.amazon.alexa:ask-sdk-core:jar:2.30.1:compile
[INFO] |  +- com.amazon.alexa:ask-sdk-runtime:jar:2.30.1:compile
[INFO] |  |  +- com.fasterxml.jackson.core:jackson-core:jar:2.10.4:compile
[INFO] |  |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.10.4:compile
[INFO] |  |  |  +- (com.fasterxml.jackson.core:jackson-annotations:jar:2.10.4:compile - omitted for conflict with 2.9.10)
[INFO] |  |  |  \- (com.fasterxml.jackson.core:jackson-core:jar:2.10.4:compile - omitted for duplicate)
[INFO] |  |  +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.10.4:compile
[INFO] |  |  |  +- (com.fasterxml.jackson.core:jackson-annotations:jar:2.10.4:compile - omitted for duplicate)
[INFO] |  |  |  +- (com.fasterxml.jackson.core:jackson-core:jar:2.10.4:compile - omitted for duplicate)
[INFO] |  |  |  \- (com.fasterxml.jackson.core:jackson-databind:jar:2.10.4:compile - omitted for duplicate)
[INFO] |  |  \- (org.apache.logging.log4j:log4j-slf4j-impl:jar:2.8.2:compile - omitted for duplicate)
[INFO] |  \- com.amazon.alexa:ask-sdk-model:jar:1.28.1:compile
[INFO] |     \- (com.amazon.alexa:ask-sdk-model-runtime:jar:1.0.2:compile - omitted for conflict with 1.0.3)
[INFO] +- com.amazon.alexa:ask-sdk-lambda-support:jar:2.30.1:compile
[INFO] |  +- (com.amazon.alexa:ask-sdk-runtime:jar:2.30.1:compile - omitted for duplicate)
[INFO] |  +- com.amazonaws:aws-lambda-java-core:jar:1.0.0:compile
[INFO] |  \- commons-io:commons-io:jar:2.6:compile
[INFO] +- com.amazon.alexa:ask-sdk-servlet-support:jar:2.30.1:compile
[INFO] |  +- (com.amazon.alexa:ask-sdk-core:jar:2.30.1:compile - omitted for duplicate)
[INFO] |  +- commons-codec:commons-codec:jar:1.6:compile
[INFO] |  \- (commons-io:commons-io:jar:2.4:compile - omitted for conflict with 2.6)
[INFO] +- com.amazon.alexa:ask-sdk-dynamodb-persistence-adapter:jar:2.30.1:compile
[INFO] |  +- (com.amazon.alexa:ask-sdk-core:jar:2.30.1:compile - omitted for duplicate)
[INFO] |  \- com.amazonaws:aws-java-sdk-dynamodb:jar:1.11.421:compile
[INFO] |     +- com.amazonaws:aws-java-sdk-s3:jar:1.11.421:compile
[INFO] |     |  +- com.amazonaws:aws-java-sdk-kms:jar:1.11.421:compile
[INFO] |     |  |  +- (com.amazonaws:aws-java-sdk-core:jar:1.11.421:compile - omitted for duplicate)
[INFO] |     |  |  \- (com.amazonaws:jmespath-java:jar:1.11.421:compile - omitted for duplicate)
[INFO] |     |  +- (com.amazonaws:aws-java-sdk-core:jar:1.11.421:compile - omitted for duplicate)
[INFO] |     |  \- (com.amazonaws:jmespath-java:jar:1.11.421:compile - omitted for duplicate)
[INFO] |     +- com.amazonaws:aws-java-sdk-core:jar:1.11.421:compile
[INFO] |     |  +- (commons-logging:commons-logging:jar:1.1.3:compile - omitted for conflict with 1.2)
[INFO] |     |  +- (org.apache.httpcomponents:httpclient:jar:4.5.5:compile - omitted for duplicate)
[INFO] |     |  +- software.amazon.ion:ion-java:jar:1.0.2:compile
[INFO] |     |  +- (com.fasterxml.jackson.core:jackson-databind:jar:2.6.7.1:compile - omitted for conflict with 2.10.4)
[INFO] |     |  +- com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:jar:2.6.7:compile
[INFO] |     |  |  \- (com.fasterxml.jackson.core:jackson-core:jar:2.6.7:compile - omitted for conflict with 2.10.4)
[INFO] |     |  \- joda-time:joda-time:jar:2.8.1:compile
[INFO] |     \- com.amazonaws:jmespath-java:jar:1.11.421:compile
[INFO] |        \- (com.fasterxml.jackson.core:jackson-databind:jar:2.6.7.1:compile - omitted for conflict with 2.10.4)
[INFO] +- com.amazon.alexa:ask-sdk-apache-client:jar:2.30.1:compile
[INFO] |  +- com.amazon.alexa:ask-sdk-model-runtime:jar:1.0.3:compile
[INFO] |  |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.9.10:compile
[INFO] |  |  +- (com.fasterxml.jackson.core:jackson-databind:jar:2.9.10.3:compile - omitted for conflict with 2.10.4)
[INFO] |  |  +- (com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.9.10:compile - omitted for conflict with 2.10.4)
[INFO] |  |  \- (org.apache.logging.log4j:log4j-slf4j-impl:jar:2.8.2:compile - omitted for duplicate)
[INFO] |  \- org.apache.httpcomponents:httpclient:jar:4.5.5:compile
[INFO] |     +- org.apache.httpcomponents:httpcore:jar:4.4.9:compile
[INFO] |     +- commons-logging:commons-logging:jar:1.2:compile
[INFO] |     \- (commons-codec:commons-codec:jar:1.10:compile - omitted for conflict with 1.6)
[INFO] +- com.amazon.alexa:ask-sdk-freemarker:jar:2.30.1:compile
[INFO] |  +- (com.amazon.alexa:ask-sdk-runtime:jar:2.30.1:compile - omitted for duplicate)
[INFO] |  +- org.freemarker:freemarker:jar:2.3.28:compile
[INFO] |  \- org.apache.logging.log4j:log4j-slf4j-impl:jar:2.8.2:compile
[INFO] |     +- org.slf4j:slf4j-api:jar:1.7.24:compile
[INFO] |     \- org.apache.logging.log4j:log4j-api:jar:2.8.2:compile
[INFO] +- org.powermock:powermock-api-mockito:jar:1.7.3:test
[INFO] |  +- org.powermock:powermock-api-mockito-common:jar:1.7.3:test
[INFO] |  |  +- org.powermock:powermock-api-support:jar:1.7.3:test
[INFO] |  |  |  +- org.powermock:powermock-reflect:jar:1.7.3:test
[INFO] |  |  |  |  \- (org.objenesis:objenesis:jar:2.4:test - omitted for conflict with 2.5)
[INFO] |  |  |  \- org.powermock:powermock-core:jar:1.7.3:test
[INFO] |  |  |     +- (org.powermock:powermock-reflect:jar:1.7.3:test - omitted for duplicate)
[INFO] |  |  |     +- org.javassist:javassist:jar:3.21.0-GA:test
[INFO] |  |  |     \- (org.mockito:mockito-core:jar:2.8.9:test - omitted for duplicate)
[INFO] |  |  \- (org.mockito:mockito-core:jar:2.8.9:test - omitted for conflict with 1.10.19)
[INFO] |  \- org.mockito:mockito-core:jar:1.10.19:test
[INFO] |     +- (org.hamcrest:hamcrest-core:jar:1.1:test - omitted for conflict with 1.3)
[INFO] |     \- org.objenesis:objenesis:jar:2.1:test
[INFO] \- junit:junit:jar:4.12:test
[INFO]    \- org.hamcrest:hamcrest-core:jar:1.3:test
breedloj commented 4 years ago

Hey, thanks for reaching out and reporting this. We recently upgraded our dependency on Jackson's libraries to 2.10.4 to address security concerns with the older 2.9.x branch. This seems to have an unforeseen side effect of breaking compatibility with methods the AWS SDK (v1) is using since that is still directly depending on Jackson 2.6.

Downgrading our dependency is out of the question due to the aforementioned security concerns. I think the best long term solution here is to bump our dependency on the AWS SDK for Java to the newer v2 branch which was released to GA last year. This depends on the current version of Jackson which should address the inherent incompatibilities. However I am a bit concerned about rolling that change directly to the existing SDK dependency tree since I am sure some folks transitively depend on the AWS SDK through us. I'll have to do some digging into a good strategy for rolling this out non intrusively.

sattpat commented 4 years ago

Closing this issue after 27 days of inactivity.

sattpat commented 4 years ago

I am sorry, I didnt see the action item that @breedloj had mentioned. Reopening.

Bing-ok commented 4 years ago

Thanks for your support! I‘m also considering a better solution @breedloj @sattpat

breedloj commented 3 years ago

The PR I opened last week (referenced above) is designed to address this issue by upgrading our AWS SDK dependency to the 2.x branch which depends on the same version of Jackson (2.10.x) as us. Would love to get your thoughts!

Bing-ok commented 3 years ago

I think this is a good solution. com.fasterxml.jackson.core:jackson-core:2.6.7 won't be transitively introduced after upgrading AWS SDK dependency to the 2.x.