Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
作为Gradle Java项目的一部分运行Dynamodb local_Java_Gradle_Amazon Dynamodb_Dynamo Local - Fatal编程技术网

作为Gradle Java项目的一部分运行Dynamodb local

作为Gradle Java项目的一部分运行Dynamodb local,java,gradle,amazon-dynamodb,dynamo-local,Java,Gradle,Amazon Dynamodb,Dynamo Local,我正在尝试运行DynamoDB local进行测试。我遵循了amazon提供的步骤来设置和运行jar(链接到amazon的教程)。但是,本教程没有在您自己的项目中运行jar。我不希望所有其他开发人员每次测试代码时都必须抓取一个jar并在本地运行它 这就是我的问题所在。作为测试的一部分,我很难在线找到如何配置Gradle项目来运行DynamoDB本地服务器的示例。我找到了下面的maven示例,并试图将其转换为Gradle,但他们使用的所有com.amazonaws.services.dynamod

我正在尝试运行DynamoDB local进行测试。我遵循了amazon提供的步骤来设置和运行jar(链接到amazon的教程)。但是,本教程没有在您自己的项目中运行jar。我不希望所有其他开发人员每次测试代码时都必须抓取一个jar并在本地运行它

这就是我的问题所在。作为测试的一部分,我很难在线找到如何配置Gradle项目来运行DynamoDB本地服务器的示例。我找到了下面的maven示例,并试图将其转换为Gradle,但他们使用的所有
com.amazonaws.services.dynamodbv2.local
import语句都出现了错误。错误是找不到资源

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

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

import com.amazonaws.services.dynamodbv2.local.embedded.DynamoDBEmbedded;
TL;博士


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

我们有DynamoDB local与Gradle合作。以下是您需要添加到gradle.build文件的内容:

适用于gradle 4.x及以下版本

1) 添加到“存储库”部分:

    maven {
        url 'http://dynamodb-local.s3-website-us-west-2.amazonaws.com/release'
    }
2) 添加到dependencies部分(假设您将其用于测试):

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测试并让您的测试运行到您的本地DynamoDB。

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

  • 从这里下载JAR:

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

  • 最后,添加到build.gradle:

    dependencies {
        runtime files('libs/DynamoDBLocal.jar')
    }
    

  • 我遇到了同样的问题,首先我尝试向Gradle脚本添加sqlite4java.library.path,正如其他注释中提到的那样

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

    AwsDynamoDbLocalTestUtils.initSqLite();
    AmazonDynamoDBLocal amazonDynamoDBLocal = DynamoDBEmbedded.create();
    
    可在此处找到实现:


    我给GitHub举了一个完整的例子,它可能会有所帮助:

    对于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'
    }
    
    2018年8月,亚马逊DynamoDB本地上市。它不需要下载和运行任何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
    
    因此,在
    测试期间
    任务DynamoDB将在
    http://dynamodb-local:8000

    另一个更强大的工具是。它支持24个AWS服务,DynamoDB就是其中之一。isage非常类似,您必须在运行测试之前启动它,它将在以下位置公开与AWS兼容的API:


    其思想是将所有配置移出构建工具和测试,并从外部提供依赖关系。可以将其视为依赖注入/IoC,但要考虑整个服务,而不仅仅是单个bean。这样,您的代码就是。您可以在上面的示例中看到:只需更改
    image
    部分,就可以将模拟实现从DynamoDB Local切换到localstack

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

    val copyNativeDeps by tasks.creating(Copy::class){
    from(configurations.testRuntimeClasspath){
    包括(“*.dylib”)
    包括(“*.so”)
    包括(“*.dll”)
    }
    进入($buildDir/libs)
    }
    tasks.withType{
    dependsOn.add(copyNativeDeps)
    doFirst{systemProperty(“java.library.path”,“$buildDir/libs”)}
    }
    

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

    我意识到,如果我能让gradle运行以下命令,应该可以解决我的问题:java-Djava.library.path=./DynamoDBLocal\u lib-jar DynamoDBLocal.jar-sharedDbThanks获得答案Serega。我不再从事这个项目,所以我需要一段时间来测试和验证你的答案…没问题。希望它对其他偶然发现此线程以解决类似问题的人有用。我在哪里可以获得最新版本的DynamoDBLocal。。。我已经设置了一个gradle项目,并使用了1.11.0版本-请回复链接可以而且通常会死掉。最好编辑您的答案,包括获取jar的路径或类似的内容。如果您想从Gradle 5升级,这也适用于Gradle 6.0.1
    docker run -p 8000:8000 amazon/dynamodb-local
    
    test:
      stage: test
      image: openjdk:8-alpine
      services:
        - name: amazon/dynamodb-local
          alias: dynamodb-local
      script:
        - ./gradlew clean test
    
    test:
      stage: test
      image: openjdk:8-alpine
      services:
        - name: localstack/localstack
        alias: localstack
      script:
        - ./gradlew clean test