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