When I run this code as a jar file (java -jar TestAwsJavaDemoApplication.jar) in my Ubuntu VM, I get the bottom exception. GCP’s VM hitting AWS’s S3 Bucket. Here’s the code.
package com.maven.cli;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.Bucket;
import com.amazonaws.services.s3.model.CannedAccessControlList;
@SpringBootApplication
public class TestAwsJavaDemoApplication {
public static void main(String[] args) {
SpringApplication.run(TestAwsJavaDemoApplication.class, args);
listBuckets();
}
private static void listBuckets() {
System.out.println("Listing buckets");
AmazonS3 s3 = new AmazonS3Client(); //InvocationTargetException
Region unitedStatesRegion = Region.getRegion(Regions.US_WEST_1);
s3.setRegion(unitedStatesRegion);
System.out.println("s3= "+ s3);
for (Bucket bucket : s3.listBuckets()) {
System.out.println(" - " + bucket.getName());
}
System.out.println("Done Listing the Buckets");
}
}
Here’s the Tomcat Logs:
Listing buckets
s3= com.amazonaws.services.s3.AmazonS3Client@571c5681
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
at com.amazonaws.util.Base64.encodeAsString(Base64.java:36)
at com.amazonaws.auth.AbstractAWSSigner.signAndBase64Encode(AbstractAWSSigner.java:70)
at com.amazonaws.auth.AbstractAWSSigner.signAndBase64Encode(AbstractAWSSigner.java:58)
at com.amazonaws.services.s3.internal.S3Signer.sign(S3Signer.java:127)
at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:652)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:460)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:295)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3697)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3647)
at com.amazonaws.services.s3.AmazonS3Client.listBuckets(AmazonS3Client.java:674)
at com.amazonaws.services.s3.AmazonS3Client.listBuckets(AmazonS3Client.java:682)
at com.maven.cli.TestAwsJavaDemoApplication.listBuckets(TestAwsJavaDemoApplication.java:55)