我正在尝试将 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.
<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:
- https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/setup-project-maven.html#configuring-maven-individual-components
- https://docs.aws.amazon.com/sdk-for-java/v2/migration-guide/whats-different.html
不要在生产中这样做:
您也可以自己承担风险并强制自己依赖:
<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/