13

我正在尝试在本地运行 DynamoDB 以进行测试。我按照亚马逊提供的步骤设置它并单独运行 jar 工作正常(链接到亚马逊的教程Here)。但是,本教程不会在您自己的项目中运行 jar。我不希望所有其他开发人员每次测试他们的代码时都必须获取一个 jar 并在本地运行它。

这就是我的问题所在。作为我的测试的一部分,我很难在网上找到任何关于如何配置 Gradle 项目以运行 DynamoDB 本地服务器的示例。我找到了以下 maven 示例https://github.com/awslabs/aws-dynamodb-examples/blob/master/src/test/java/com/amazonaws/services/dynamodbv2/DynamoDBLocalFixture.java#L32并正在尝试转换它到 Gradle,但com.amazonaws.services.dynamodbv2.local他们正在使用的所有导入语句都出现错误。错误是找不到资源。

我进入他们项目的 pom 并将以下内容放入我的build.gradle文件中以模拟它。

//dynamodb local dependencies
testCompile('com.amazonaws:aws-java-sdk-dynamodb:1.10.42')
testCompile('com.amazonaws:aws-java-sdk-cloudwatch:1.10.42')
testCompile('com.amazonaws:aws-java-sdk:1.3.0')
testCompile('com.amazonaws:amazon-kinesis-client:1.6.1')
testCompile('com.amazonaws:amazon-kinesis-connectors:1.1.1')
testCompile('com.amazonaws:dynamodb-streams-kinesis-adapter:1.0.2')
testCompile('com.amazonaws:DynamoDBLocal:1.10.5.1')

导入语句仍然失败。这是一个失败的例子。

import com.amazonaws.services.dynamodbv2.local.embedded.DynamoDBEmbedded;

TL;博士

有没有人设法让 DynamoDB 本地 JAR 作为 Gradle 项目的一部分执行,或者有一个好的教程链接(它不一定是我链接到的教程)。

4

6 回答 6

24

我们让 DynamoDB 本地使用 gradle。这是您需要添加到 gradle.build 文件中的内容:

对于 gradle 4.x 及以下版本

1)添加到存储库部分:

    maven {
        url 'http://dynamodb-local.s3-website-us-west-2.amazonaws.com/release'
    }

2)添加到依赖项部分(假设您将其用于测试):

    testCompile group: 'com.amazonaws', name: 'DynamoDBLocal', version: 1.11.0

3)接下来的两个步骤是棘手的部分。首先将本机文件复制到一个目录:

task copyNativeDeps(type: Copy) {
    from (configurations.testCompile) {
        include "*.dylib"
        include "*.so"
        include "*.dll"
    }
    into 'build/libs'
}

4)然后确保在 java 库路径中包含此目录(在我们的例子中为 build/libs),如下所示:

test.dependsOn copyNativeDeps
test.doFirst {
    systemProperty "java.library.path", 'build/libs'
}

现在您应该能够运行 ./gradlew test 并让您的测试访问您的本地 DynamoDB。

于 2016-04-21T18:16:09.227 回答
7

对于 Gradle 5.x,以下解决方案有效

 maven {
        url 'http://dynamodb-local.s3-website-us-west-2.amazonaws.com/release'
    }

configurations {
        dynamodb
    }

dependencies {
    testImplementation 'com.amazonaws:DynamoDBLocal:1.11.477'
    dynamodb fileTree (dir: 'lib', include: ["*.dylib", "*.so", "*.dll"])
    dynamodb 'com.amazonaws:DynamoDBLocal:1.11.477'
}

task copyNativeDeps(type: Copy) {
    from configurations.dynamodb
    into "$project.buildDir/libs/"
}

test.dependsOn copyNativeDeps
test.doFirst {
    systemProperty "java.library.path", 'build/libs'
}
于 2019-03-21T13:49:18.067 回答
4

我遇到了同样的问题,首先我尝试将 sqlite4java.library.path 添加到 Gradle 脚本中,正如其他评论中提到的那样。

这适用于命令行,但当我从 IDE(IntelliJ IDEA)运行测试时不起作用,所以最后我想出了一个简单的 init 方法,在每个集成测试开始时调用它:

AwsDynamoDbLocalTestUtils.initSqLite();
AmazonDynamoDBLocal amazonDynamoDBLocal = DynamoDBEmbedded.create();

可以在这里找到实现:https ://github.com/redskap/aws-dynamodb-java-example-local-testing/blob/master/src/test/java/io/redskap/java/aws/dynamodb/example/本地/测试/AwsDynamoDbLocalTestUtils.java

我在 GitHub 上放了一个完整的示例,它可能会有所帮助:https ://github.com/redskap/aws-dynamodb-java-example-local-testing

于 2018-05-06T23:01:38.650 回答
2

2018 年 8 月, Amazon 宣布了新的Docker 映像,其中包含 Amazon DynamoDB Local。它不需要下载和运行任何 JAR,也不需要使用第三方操作系统特定的二进制文件(如sqlite4java.

就像在测试之前启动一个 Docker 容器一样简单:

docker run -p 8000:8000 amazon/dynamodb-local

如上所述,您可以手动为本地开发执行此操作,或在 CI 管道中使用它。许多 CI 服务提供了在管道期间启动其他容器的能力,这些容器可以为您的测试提供依赖项。这是 Gitlab CI/CD 的示例:

test:
  stage: test
  image: openjdk:8-alpine
  services:
    - name: amazon/dynamodb-local
      alias: dynamodb-local
  script:
    - ./gradlew clean test

因此,在test任务期间 DynamoDB 将在http://dynamodb-local:8000.

另一个更强大的工具是localstack。它支持两打 AWS 服务,DynamoDB 就是其中之一。isage 非常相似,您必须在运行测试之前启动它,它会在给定端口上公开与 AWS 兼容的 API :

test:
  stage: test
  image: openjdk:8-alpine
  services:
    - name: localstack/localstack
    alias: localstack
  script:
    - ./gradlew clean test

这个想法是将所有配置移出构建工具和测试,并在外部提供依赖关系。将其视为依赖注入/IoC,但对于整个服务,而不仅仅是单个 bean。这样,您的代码就更加干净和可维护。即使在上面的示例中,您也可以看到:您可以通过简单地更改image部分来将模拟实现从 DynamoDB Local 切换到 localstack!

于 2019-09-26T19:15:40.977 回答
1

在我看来,最简单的方法是:

  1. 从这里下载 JAR:http: //docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html#DynamoDBLocal.DownloadingAndRunning

  2. 然后解压下载的文件夹,并将其内容添加到项目中的/libs文件夹中(在此之前创建/libs文件夹)

  3. 最后,添加到 build.gradle:

    dependencies {
        runtime files('libs/DynamoDBLocal.jar')
    }
    
于 2017-12-03T08:17:39.260 回答
0

我不想为 gradle 6+ 的 dynamo 创建特定配置,所以我调整了原始答案说明。此外,这是在 kotlin gradle DSL 中,而不是在 groovy 中。

val copyNativeDeps by tasks.creating(Copy::class) {
    from(configurations.testRuntimeClasspath) {
        include("*.dylib")
        include("*.so")
        include("*.dll")
    }
    into("$buildDir/libs")
}

tasks.withType<Test> {
    dependsOn.add(copyNativeDeps)
    doFirst { systemProperty("java.library.path", "$buildDir/libs") }
}

通过利用testRuntimeClasspath配置,gradle 能够为您找到相关文件,而无需创建自定义配置。显然,这有副作用,如果您的测试运行时有许多本机 dep,它们也会被复制,这将使自定义配置方法更加理想。

于 2020-04-06T17:40:14.960 回答