Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

java.lang.NoClassDefFoundError: software/amazon/awssdk/utils/Lazy #4075

Closed
indranilbanerjeeawssa opened this issue Jun 8, 2023 · 5 comments
Assignees
Labels
bug This issue is a bug. closing-soon This issue will close in 4 days unless further comments are made.

Comments

@indranilbanerjeeawssa
Copy link

Describe the bug

Get the following exception, when running the below code

Start Exception

Exception in thread "main" java.lang.NoClassDefFoundError: software/amazon/awssdk/utils/Lazy
at software.amazon.awssdk.auth.credentials.internal.LazyAwsCredentialsProvider.(LazyAwsCredentialsProvider.java:36)
at software.amazon.awssdk.auth.credentials.internal.LazyAwsCredentialsProvider.create(LazyAwsCredentialsProvider.java:40)
at software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider.createChain(DefaultCredentialsProvider.java:71)
at software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider.(DefaultCredentialsProvider.java:53)
at software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider.(DefaultCredentialsProvider.java:45)
at activemq.producer.SecretsManagerDecoder.getSecret(SecretsManagerDecoder.java:15)
at activemq.producer.SecretsManagerDecoder.main(SecretsManagerDecoder.java:37)
Caused by: java.lang.ClassNotFoundException: software.amazon.awssdk.utils.Lazy
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
... 7 more

End Exception

Start Code

package activemq.producer;

import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient;
import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest;
import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse;

public class SecretsManagerDecoder {

public static String getSecret() {

	String secretName = "AmazonMQCredentials";
    SecretsManagerClient client = SecretsManagerClient.builder()
    		.credentialsProvider(DefaultCredentialsProvider.builder().build())
            .build();

    GetSecretValueRequest getSecretValueRequest = GetSecretValueRequest.builder()
            .secretId(secretName)
            .build();

    GetSecretValueResponse getSecretValueResponse = null;

    try {
        getSecretValueResponse = client.getSecretValue(getSecretValueRequest);
    } catch (Exception e) {
        e.printStackTrace();
    }
    if (null != getSecretValueResponse) {
    	return getSecretValueResponse.secretString();
    } else {
    	return "Sorry mate! No secret found";
    }
}

public static void main(String[] args) {
	System.out.println(SecretsManagerDecoder.getSecret());
}

}

End Code*

Begin POM File

4.0.0 com.indranil.samples.java.activemq json-activemq-producer 0.0.1-SNAPSHOT UTF-8 11 11 com.amazonaws aws-lambda-java-core 1.2.1 com.amazonaws aws-lambda-java-events 3.11.0 com.google.code.gson gson 2.8.9 software.amazon.msk aws-msk-iam-auth 1.0.0 org.apache.kafka kafka-clients 3.4.0 org.apache.logging.log4j log4j-api [2.17.1,) org.apache.logging.log4j log4j-core [2.17.1,) org.apache.logging.log4j log4j-slf4j18-impl [2.17.1,) org.junit.jupiter junit-jupiter-api 5.6.0 test org.junit.jupiter junit-jupiter-engine 5.6.0 test software.amazon.awssdk regions 2.4.3 software.amazon.awssdk secretsmanager 2.15.80 software.amazon.awssdk utils 2.10.49 com.amazonaws aws-java-sdk-ec2 1.12.483 maven-surefire-plugin 2.22.2 org.apache.maven.plugins maven-shade-plugin 3.2.2 false package shade org.apache.maven.plugins maven-compiler-plugin 3.8.1 1.8 1.8

End POM File*

To reproduce, create a secret in Secrets Manager by the name "AmazonMQCredentials" and create some secret inside it, eg. user = admin

Then run the above code.

Expected Behavior

Code should run and print out the value of the secret from Secrets Manager

Current Behavior

Exception in thread "main" java.lang.NoClassDefFoundError: software/amazon/awssdk/utils/Lazy
at software.amazon.awssdk.auth.credentials.internal.LazyAwsCredentialsProvider.(LazyAwsCredentialsProvider.java:36)
at software.amazon.awssdk.auth.credentials.internal.LazyAwsCredentialsProvider.create(LazyAwsCredentialsProvider.java:40)
at software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider.createChain(DefaultCredentialsProvider.java:71)
at software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider.(DefaultCredentialsProvider.java:53)
at software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider.(DefaultCredentialsProvider.java:45)
at activemq.producer.SecretsManagerDecoder.getSecret(SecretsManagerDecoder.java:15)
at activemq.producer.SecretsManagerDecoder.main(SecretsManagerDecoder.java:37)
Caused by: java.lang.ClassNotFoundException: software.amazon.awssdk.utils.Lazy
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
... 7 more

Reproduction Steps

To reproduce, create a secret in Secrets Manager by the name "AmazonMQCredentials" and create some secret inside it, eg. user = admin

Then run the above code.

Possible Solution

No response

Additional Information/Context

POM File

4.0.0 com.indranil.samples.java.activemq json-activemq-producer 0.0.1-SNAPSHOT UTF-8 11 11 com.amazonaws aws-lambda-java-core 1.2.1 com.amazonaws aws-lambda-java-events 3.11.0 com.google.code.gson gson 2.8.9 software.amazon.msk aws-msk-iam-auth 1.0.0 org.apache.kafka kafka-clients 3.4.0 org.apache.logging.log4j log4j-api [2.17.1,) org.apache.logging.log4j log4j-core [2.17.1,) org.apache.logging.log4j log4j-slf4j18-impl [2.17.1,) org.junit.jupiter junit-jupiter-api 5.6.0 test org.junit.jupiter junit-jupiter-engine 5.6.0 test software.amazon.awssdk regions 2.4.3 software.amazon.awssdk secretsmanager 2.15.80 software.amazon.awssdk utils 2.10.49 com.amazonaws aws-java-sdk-ec2 1.12.483 maven-surefire-plugin 2.22.2 org.apache.maven.plugins maven-shade-plugin 3.2.2 false package shade org.apache.maven.plugins maven-compiler-plugin 3.8.1 1.8 1.8

AWS Java SDK version used

2 (refer POM file)

JDK version used

openjdk version "17.0.7" 2023-04-18 LTS OpenJDK Runtime Environment Corretto-17.0.7.7.1 (build 17.0.7+7-LTS) OpenJDK 64-Bit Server VM Corretto-17.0.7.7.1 (build 17.0.7+7-LTS, mixed mode, sharing)

Operating System and version

NAME="Amazon Linux" VERSION="2" ID="amzn" ID_LIKE="centos rhel fedora" VERSION_ID="2" PRETTY_NAME="Amazon Linux 2" ANSI_COLOR="0;33" CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2" HOME_URL="https://amazonlinux.com/"

@indranilbanerjeeawssa indranilbanerjeeawssa added bug This issue is a bug. needs-triage This issue or PR still needs to be triaged. labels Jun 8, 2023
@indranilbanerjeeawssa
Copy link
Author

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.indranil.samples.java.activemq</groupId> <artifactId>json-activemq-producer</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-events</artifactId> <version>3.11.0</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.9</version> </dependency> <dependency> <groupId>software.amazon.msk</groupId> <artifactId>aws-msk-iam-auth</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>[2.17.1,)</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>[2.17.1,)</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j18-impl</artifactId> <version>[2.17.1,)</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.6.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.6.0</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/software.amazon.awssdk/regions --> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>regions</artifactId> <version>2.4.3</version> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>secretsmanager</artifactId> <version>2.15.80</version> </dependency> <!-- https://mvnrepository.com/artifact/software.amazon.awssdk/utils --> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>utils</artifactId> <version>2.10.49</version> </dependency> <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-ec2 --> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-ec2</artifactId> <version>1.12.483</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.2</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>

@indranilbanerjeeawssa
Copy link
Author

You don't even have to use my modified code to see the issue. Just take the code generated by Secrets Manager as-is and try running it. You will run into this error

// Use this code snippet in your app.
// If you need more information about configurations or implementing the sample
// code, visit the AWS docs:
// https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/home.html

// Make sure to import the following packages in your code
// import software.amazon.awssdk.regions.Region;
// import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient;
// import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest;
// import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse;

public static void getSecret() {

String secretName = "AmazonMQCredentials";
Region region = Region.of("us-west-2");

// Create a Secrets Manager client
SecretsManagerClient client = SecretsManagerClient.builder()
        .region(region)
        .build();

GetSecretValueRequest getSecretValueRequest = GetSecretValueRequest.builder()
        .secretId(secretName)
        .build();

GetSecretValueResponse getSecretValueResponse;

try {
    getSecretValueResponse = client.getSecretValue(getSecretValueRequest);
} catch (Exception e) {
    // For a list of exceptions thrown, see
    // https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html
    throw e;
}

String secret = getSecretValueResponse.secretString();

// Your code goes here.

}

@debora-ito
Copy link
Member

NoClassDefFoundError indicates that a class could not be loaded at runtime. This is usually caused by using different versions of the SDK core and service modules. Ideally, all SDK modules should be in the same version.

Looking at your pom.xml, you are using different versions for different SDK modules, this is probably the root cause:
software.amazon.awssdk:regions 2.4.3
software.amazon.awssdk:secretsmanager 2.15.80
software.amazon.awssdk:utils 2.10.49

We recommend using the BOM artifact to avoid this problem, check more info in our Dev Guide - https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup-project-maven.html#sdk-as-dependency

@debora-ito debora-ito added closing-soon This issue will close in 4 days unless further comments are made. and removed needs-triage This issue or PR still needs to be triaged. labels Jun 8, 2023
@debora-ito debora-ito self-assigned this Jun 8, 2023
@indranilbanerjeeawssa
Copy link
Author

OK. After using the BOM, it worked. Thanks. Closing the issue

@github-actions
Copy link

github-actions bot commented Jun 9, 2023

⚠️COMMENT VISIBILITY WARNING⚠️

Comments on closed issues are hard for our team to see.
If you need more assistance, please open a new issue that references this one.
If you wish to keep having a conversation with other community members under this issue feel free to do so.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug This issue is a bug. closing-soon This issue will close in 4 days unless further comments are made.
Projects
None yet
Development

No branches or pull requests

2 participants