java - com.amazonaws.transform.JsonErrorUnmarshaller : method <init>(Ljava/lang/Class;)V not found

标签 java amazon-web-services logback amazon-cloudwatch amazon-cloudwatchlogs

我们正在使用名为 logback-ext-cloudwatch-appender 的库将基于 logback 的日志发送到 AWS Cloudwatch。这就是我们的 pom.xml 文件中的依赖关系。

    <dependency>
        <groupId>org.eluder.logback</groupId>
        <artifactId>logback-ext-cloudwatch-appender</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

几天前,这些错误开始出现在我们的日志中。

java.lang.NoSuchMethodError: com.amazonaws.transform.JsonErrorUnmarshaller: method <init>(Ljava/lang/Class;)V not found
    at com.amazonaws.services.logs.model.transform.InvalidParameterExceptionUnmarshaller.<init>(InvalidParameterExceptionUnmarshaller.java:26)
    at com.amazonaws.services.logs.AWSLogsClient.init(AWSLogsClient.java:280)
    at com.amazonaws.services.logs.AWSLogsClient.<init>(AWSLogsClient.java:275)
    at com.amazonaws.services.logs.AWSLogsClient.<init>(AWSLogsClient.java:248)
    at org.eluder.logback.ext.cloudwatch.appender.AbstractCloudWatchAppender.doStart(AbstractCloudWatchAppender.java:100)
    at org.eluder.logback.ext.aws.core.AbstractAwsEncodingStringAppender.start(AbstractAwsEncodingStringAppender.java:123)
    at org.eluder.logback.ext.cloudwatch.appender.AbstractCloudWatchAppender.start(AbstractCloudWatchAppender.java:95)
    at ch.qos.logback.ext.spring.DelegatingLogbackAppender.getDelegate(Unknown Source)
    at ch.qos.logback.ext.spring.DelegatingLogbackAppender.append(Unknown Source)
    at ch.qos.logback.ext.spring.DelegatingLogbackAppender.append(Unknown Source)
    at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:84)
    at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:48)
    at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:270)
    at ch.qos.logback.classic.Logger.callAppenders(Logger.java:257)
    at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:421)
    at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:383)
    at ch.qos.logback.classic.Logger.info(Logger.java:579)
    (truncated)

我发现我们已升级到 AWS 1.11.5,但我在该版本中找不到此类错误的任何证据。

最佳答案

事实证明,当前版本的 logback-ext-cloudwatch-appender 对特定版本的 aws-java-sdk-logs 1.10.2 有传递依赖性,该版本兼容其他 aws-java-sdk 库 1.11.0 及更高版本。我们确实使用了许多其他 aws-java-sdk 库。我们像这样排除了依赖关系。

<dependency>
    <groupId>org.eluder.logback</groupId>
    <artifactId>logback-ext-cloudwatch-appender</artifactId>
    <version>1.0-SNAPSHOT</version>
    <exclusions>
        <exclusion>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-logs</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-core</artifactId>
    <version>1.11.5</version>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-logs</artifactId>
    <version>1.11.5</version>
</dependency>

此时我们开始收到另一个错误。

 Exception in thread "org.myorg.task.MyTask working" java.lang.NoSuchMethodError: com.amazonaws.services.logs.AWSLogsClient.createLogGroup(Lcom/amazonaws/services/logs/model/CreateLogGroupRequest;)V
         at org.eluder.logback.ext.cloudwatch.appender.AbstractCloudWatchAppender.createLogGroup(AbstractCloudWatchAppender.java:171)
         at org.eluder.logback.ext.cloudwatch.appender.AbstractCloudWatchAppender.doStart(AbstractCloudWatchAppender.java:107)
         at org.eluder.logback.ext.aws.core.AbstractAwsEncodingStringAppender.start(AbstractAwsEncodingStringAppender.java:123)
         at org.eluder.logback.ext.cloudwatch.appender.AbstractCloudWatchAppender.start(AbstractCloudWatchAppender.java:95)
         at ch.qos.logback.core.joran.action.AppenderAction.end(AppenderAction.java:90)
         at ch.qos.logback.core.joran.spi.Interpreter.callEndAction(Interpreter.java:309)
         at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:193)
         at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:179)
         at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:62)
         at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:155)
         at ch.qos.logback.core.sift.SiftingJoranConfiguratorBase.doConfigure(SiftingJoranConfiguratorBase.java:82)
         at ch.qos.logback.core.sift.AbstractAppenderFactoryUsingJoran.buildAppender(AbstractAppenderFactoryUsingJoran.java:51)
         at ch.qos.logback.core.sift.AppenderTracker.buildComponent(AppenderTracker.java:56)
         at ch.qos.logback.core.sift.AppenderTracker.buildComponent(AppenderTracker.java:32)
         at ch.qos.logback.core.spi.AbstractComponentTracker.getOrCreate(AbstractComponentTracker.java:124)
         at ch.qos.logback.core.sift.SiftingAppenderBase.append(SiftingAppenderBase.java:104)
         at ch.qos.logback.core.AppenderBase.doAppend(AppenderBase.java:82)
         at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:48)
         at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:270)
         at ch.qos.logback.classic.Logger.callAppenders(Logger.java:257)
         at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:421)
         at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:383)
         at ch.qos.logback.classic.Logger.info(Logger.java:579)

仅仅排除依赖关系是行不通的。我必须 fork 并重建 logback-ext-cloudwatch-appender jar 并依赖于当前的 1.11.5 aws-java-sdk 库。尝试将新的 AWS 依赖项与针对旧库构建的 logback-ext-cloudwatch-appender jar 一起使用会导致 createLogGroup 的方法签名(返回类型)不匹配,从而导致运行时错误。为了让它运行,我只需要在我的 fork 版本中更改 pom.xml 文件,而不是源代码。

关于java - com.amazonaws.transform.JsonErrorUnmarshaller : method <init>(Ljava/lang/Class;)V not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37618971/

相关文章:

Java 方法重载最佳实践

java - 使用回收器在 android Studio 中获取 NullPointerException

java - 对于同一接口(interface)的多个实现,应该如何编写junit测试用例?

c# - .NET Core AWS RDS 连接

java - 如何在运行时更改单个记录器的日志级别?

java - jetty :如何声明 JVM 范围内的 jndi 条目并绑定(bind)到 java:comp/env

c# - 如何在 ParameterStore aws .NET C# 中设置参数的过期时间?

json - AWS 云形成 : "Parameter [subnetIds] is invalid"

eclipse - 编写 XSD 架构来验证任何 XML 文件是否有效

java - 为什么 logback 不使用 Spring Boot 记录某些行?