【问题标题】:AWS Java SDK isn't found at runtime在运行时找不到 AWS Java SDK
【发布时间】:2026-01-09 23:20:03
【问题描述】:

我正在尝试使用 dynamo db 运行样板代码。我正在使用 maven shade 并且在编译时一切正常,但在运行时我得到java.lang.NoClassDefFoundError: software/amazon/awssdk/services/dynamodb/DynamoDbClient。我花了至少 5 个小时尝试不同版本的 sdk,但没有任何帮助。我可以在 Intellije 的外部库区域中看到该库。

错误:

java.lang.NoClassDefFoundError: 软件/amazon/awssdk/services/dynamodb/DynamoDbClient

Pom.xml https://pastebin.com/wwaTm8yq

导致错误的代码:

DynamoDbClient ddb = DynamoDbClient.builder().build();

Map<String, AttributeValue> item = new HashMap<>();
item.put("uuid", AttributeValue.builder().s("test").build());
ddb.putItem(PutItemRequest.builder().item(item).build());

【问题讨论】:

    标签: amazon-web-services aws-sdk aws-java-sdk aws-java-sdk-2.x


    【解决方案1】:

    您的 POM 文件似乎有问题。尝试使用AWS Github repo 中的 V2 代码。您还可以找到此示例的 POM 文件。

    例如,试试这个代码:

    package com.example.dynamodb;
    
    // snippet-start:[dynamodb.java2.list_tables.import]
    import software.amazon.awssdk.regions.Region;
    import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
    import software.amazon.awssdk.services.dynamodb.model.ListTablesResponse;
    import software.amazon.awssdk.services.dynamodb.model.ListTablesRequest;
    import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
    import java.util.List;
    // snippet-end:[dynamodb.java2.list_tables.import]
    
    /**
     * Lists Amazon DynamoDB tables for the current AWS account
     *
     * This code expects that you have AWS credentials set up, as described here:
     * http://docs.aws.amazon.com/java-sdk/latest/developer-guide/setup-credentials.html
     */
    public class ListTables {
    
        public static void main(String[] args) {
    
            System.out.println("Your DynamoDB tables:\n");
    
            // Create the DynamoDbClient object
            Region region = Region.US_EAST_1;
            DynamoDbClient ddb = DynamoDbClient.builder().region(region).build();
            listAllTables(ddb);
        }
    
        // snippet-start:[dynamodb.java2.list_tables.main]
        public static void listAllTables(DynamoDbClient ddb){
    
            boolean moreTables = true;
            String lastName = null;
    
            while(moreTables) {
                try {
                    ListTablesResponse response = null;
                    if (lastName == null) {
                        ListTablesRequest request = ListTablesRequest.builder().build();
                        response = ddb.listTables(request);
                    } else {
                        ListTablesRequest request = ListTablesRequest.builder()
                                .exclusiveStartTableName(lastName).build();
                        response = ddb.listTables(request);
                    }
    
                    List<String> tableNames = response.tableNames();
    
                    if (tableNames.size() > 0) {
                        for (String curName : tableNames) {
                            System.out.format("* %s\n", curName);
                        }
                    } else {
                        System.out.println("No tables found!");
                        System.exit(0);
                    }
    
                    lastName = response.lastEvaluatedTableName();
                    if (lastName == null) {
                        moreTables = false;
                    }
                } catch (DynamoDbException e) {
                    System.err.println(e.getMessage());
                    System.exit(1);
                }
            }
            // snippet-end:[dynamodb.java2.list_tables.main]
            System.out.println("\nDone!");
        }
    }
    

    【讨论】: