java - Java 中 putObject 的 Amazon S3 "NoSuchFieldError: REQUIRES_LENGTH"?

标签 java eclipse amazon-web-services amazon-s3

我正在尝试将 JSON 对象写入 S3。我在 Eclipse IDE 上设置了 AWS 凭证,它们可以与与 DynamoDB 交互的代码正常工作 - 这些凭证可以完全访问 AWS。

我在此处使用 AWS 提供的示例代码:https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/PutObject.java

但由于某种原因,我不断收到以下错误:

java.lang.NoSuchFieldError: REQUIRES_LENGTH
at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1708)
at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1680)
at com.javapapers.webservices.rest.jersey.metrics.DailyMetricsReportWriter.writeReportToS3(DailyMetricsReportWriter.java:42)
at com.javapapers.webservices.rest.jersey.metrics.MetricsServiceTest.shoutsAndSessionsForWriter(MetricsServiceTest.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:39)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:79)
at org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:70)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at     org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

有什么想法吗?

我在其他地方读到需要 apache http-core 库,所以我添加了它,但它仍然不起作用。

我还尝试在该方法中创建一个文件并将其传递进去,但这不起作用。

我使用了一个示例,将对象元数据设置为具有长度,但这也不起作用。

我没主意了!

public String writeReportToS3(DailyMetricsReport report) {
        String bucket_name = "existing_bucket";
        String file_path = "new_file_name";
        String key_name = Paths.get(file_path).getFileName().toString();

        System.out.format("Uploading %s to S3 bucket %s...\n", file_path, bucket_name);
        final AmazonS3 s3 = AmazonS3ClientBuilder.defaultClient();
        try {
            s3.putObject(bucket_name, key_name, new File(file_path));
        } catch (AmazonServiceException e) {
            System.err.println(e.getErrorMessage());
            System.exit(1);
        }

    return "done!";
}

最佳答案

正确的解决方案:

To select individual SDK modules, use the AWS SDK for Java bill of materials (BOM) for Maven, which will ensure that the modules you specify use the same version of the SDK and that they're compatible with each other.

You can now select individual modules from the SDK that you use in your application. Because you already declared the SDK version in the BOM, you don't need to specify the version number for each component.

https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-project-maven.html#configuring-maven-individual-components

<project>
    <dependencies>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-s3</artifactId>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-dynamodb</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.amazonaws</groupId>
                <artifactId>aws-java-sdk-bom</artifactId>
                <version>1.11.615</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

检查发生情况的简单方法:mvnw dependency:tree -Dverbose -Dincludes=com.amazonaws

在本例中(bom:1.11.615),每个组件的最高兼容版本是1.11.415:

[INFO] +- com.amazonaws:aws-java-sdk-s3:jar:1.11.415:compile
[INFO] |  +- com.amazonaws:aws-java-sdk-kms:jar:1.11.415:compile
[INFO] |  +- com.amazonaws:aws-java-sdk-core:jar:1.11.415:compile
[INFO] |  \- com.amazonaws:jmespath-java:jar:1.11.415:compile
[INFO] \- com.amazonaws:aws-java-sdk-dynamodb:jar:1.11.415:compile

注意。检查适用于 Java 的 AWS 开发工具包版本 2:


不要在生产中这样做:

您也可以自己承担风险并强制自己依赖:

<project>
    <dependencies>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-s3</artifactId>
            <version>1.11.615</version>
            <exclusions>
                <exclusion>
                    <groupId>com.amazonaws</groupId>
                    <artifactId>aws-java-sdk-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.amazonaws</groupId>
                    <artifactId>aws-java-sdk-kms</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.amazonaws</groupId>
                    <artifactId>jmespath-java</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-dynamodb</artifactId>
            <version>1.11.615</version>
            <exclusions>
                <exclusion>
                    <groupId>com.amazonaws</groupId>
                    <artifactId>aws-java-sdk-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.amazonaws</groupId>
                    <artifactId>jmespath-java</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-core</artifactId>
            <version>1.11.615</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-kms</artifactId>
            <version>1.11.615</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>jmespath-java</artifactId>
            <version>1.11.615</version>
        </dependency>
    </dependencies>
</project>

现在您得到:mvnw dependency:tree -Dverbose -Dincludes=com.amazonaws

[INFO] +- com.amazonaws:aws-java-sdk-s3:jar:1.11.615:compile
[INFO] +- com.amazonaws:aws-java-sdk-dynamodb:jar:1.11.615:compile
[INFO] +- com.amazonaws:aws-java-sdk-core:jar:1.11.615:compile
[INFO] +- com.amazonaws:aws-java-sdk-kms:jar:1.11.615:compile
[INFO] \- com.amazonaws:jmespath-java:jar:1.11.615:compile

...现在您应该进行一些认真的测试:(

关于java - Java 中 putObject 的 Amazon S3 "NoSuchFieldError: REQUIRES_LENGTH"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57099076/

相关文章:

javascript - JS : check if hidden image is still in browser's cache?

java - Spring data solr HttpSolrClient 不使用来自实体的核心注释

java - 在eclipse IDE中进行java调试期间,相同的变量在 "expression view"中以不同的图标显示不同

javascript - AWS - 对预检请求的响应未通过访问控制检查 : No 'Access-Control-Allow-Origin' header is present on the requested resource

amazon-web-services - AWS Elastic Beanstalk - 没有实例

java - 我想通过滑动来查找/定位 IOS 应用程序中存在的元素

java - ArangoDB Java驱动程序: put multiple parameters in transaction

java - SessionListener 中的 Shiro HttpSession?

Java Enum.name() 意外结果包含 "?"

android - AVD 模拟器启动时出错