我正在尝试运行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项目的一部分执行,或者有一个指向好教程的链接(它不一定是我链接到的教程)。
答案 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)
在我看来,最简单的方法是:
然后解压缩下载的文件夹并将其内容添加到项目中的 / libs 文件夹中(之前创建 / libs 文件夹)
最后,添加到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();
我向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 announced新Docker 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,它们也会被复制,这将使自定义配置方法更加理想。