尝试使用java将文件上传到Amazon S3时,Jackson的NoSuchMethodError。

时间:2016-07-14 17:10:21

标签: exception amazon-s3 ant jackson aws-java-sdk

我的项目是尝试使用aws-java-sdk-1.11.15将文件上传到Amazon S3。我正在使用ant在CLI上构建我的项目。我使用的杰克逊版本是2.8.0。我正在将我的lib文件夹添加到我的类路径中。我的所有jar文件都在我的lib文件夹中。 我在运行代码时得到以下信息 -

Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.ObjectMapper.enable([Lcom/fasterx
ml/jackson/core/JsonParser$Feature;)Lcom/fasterxml/jackson/databind/ObjectMapper;
at com.amazonaws.partitions.PartitionsLoader.(PartitionsLoader.java:54)
at com.amazonaws.regions.RegionMetadataFactory.create(RegionMetadataFactory.java:30)
at com.amazonaws.regions.RegionUtils.initialize(RegionUtils.java:66)
at com.amazonaws.regions.RegionUtils.getRegionMetadata(RegionUtils.java:54)
at com.amazonaws.regions.RegionUtils.getRegion(RegionUtils.java:107)
at com.amazonaws.services.s3.AmazonS3Client.createSigner(AmazonS3Client.java:3256)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3952)
at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1538)
at code4goal.antony.resumeparser.ResumeParserProgram.main(ResumeParserProgram.java:613)

对于这段代码 -

AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider());
try
{
    File file = new File(uploadFileName);
    s3client.putObject(new PutObjectRequest(bucketName, keyName, file));
}

错误发生在s3client.putObject(new PutObjectRequest(bucketName,keyName,file));

4 个答案:

答案 0 :(得分:5)

正如Christophe L所说,那是杰克逊图书馆版本的冲突。

这是一种如何轻松和方便的方法。在您的项目中安全地使用Amazon SDK和最新的Jackson:

如果您使用依赖Jackson与Amazon SDK使用的版本冲突的其他库,请考虑使用 aws-java-sdk-bundle 它通过重命名的包名称与所有必需的库一起分发。这使您可以安全地使用亚马逊图书馆的v1.11.15和最新的杰克逊 更多信息:https://aws.amazon.com/blogs/developer/java-sdk-bundle/

    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-bundle</artifactId>
        <version>1.11.15</version>
        <!-- <version>1.11.172</version> -->
    </dependency>

P.S。亚马逊SDK 1.11.172的实际值

答案 1 :(得分:2)

看起来像是库版本冲突。 AWS Java SDK 1.11.15依赖于Jackson 2.6.6版(参见http://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-core/1.11.15)。杰克逊可能会在2.8.0中有一些重大变化,所以你可能想尝试将其降级到2.6.6并再试一次。

答案 2 :(得分:0)

如果您还使用DaggerButterknife,可能会导致使用外部库,您应该将guava作为依赖项添加到build.gradle主文件中,如classpath:

com.google.guava:guava:20.0

另一方面,如果您在使用Gradle守护程序的较大堆时出现问题,则可以增加对radle文件的添加:

 dexOptions {
        javaMaxHeapSize "4g"
    } 

还要记得使用annotationProcessor编译你的库以解决这个问题。

答案 3 :(得分:0)

尝试使用 aws-java-sdk-bundle-1.12.39 库,我解决了。尝试在使用 bundle 后包含 com.amazonaws.thirdparty.*。