作为Gradle Java项目的一部分,将Dynamodb本地运行

时间:2015-12-21 17:14:57

标签: java gradle amazon-dynamodb dynamo-local

我正在尝试运行dynamodb local进行测试。我按照亚马逊提供的步骤设置它并运行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 import语句都出错。错误是无法找到资源。

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

//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; DR

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

6 个答案:

答案 0 :(得分:20)

我们让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。

答案 1 :(得分: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')
    }
    

答案 2 :(得分:1)

我遇到了同样的问题,首先我尝试将sqlite4java.library.path添加到Gradle脚本中,因为在其他评论中已经提到过。

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

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/local/testing/AwsDynamoDbLocalTestUtils.java

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

答案 3 :(得分:1)

对于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'
}

答案 4 :(得分:0)

2018年8月Amazon announcedDocker image上安装了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就是其中之一。间隔非常相似,您必须在运行测试之前将其启动,并且它将在given ports上公开与AWS兼容的API:

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

这个想法是将所有配置移出构建工具并进行测试,并在外部提供依赖项。可以将其视为依赖项注入/ IoC,但对于整个服务,而不仅仅是单个bean。这样,您的代码就是more clean and maintainable。您甚至可以在上面的示例中看到这一点:您只需更改image部分就可以将模拟实现从DynamoDB Local切换到localstack!

答案 5 :(得分:0)

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

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,它们也会被复制,这将使自定义配置方法更加理想。