使用Gradle进行AWS Dev env设置

时间:2018-02-27 21:39:40

标签: java amazon-web-services gradle aws-lambda dynamo-local

我正在为开发人员设置一个便捷脚本,以便能够快速启动并运行,而无需启动多个终端会话,启动DynamoDB,创建表,然后启动SAM Local API来模拟请求。我决定用Gradle做这个,部分原因是因为我想更好地学习Gradle,还因为它提供了一个简单的包装器,可以包含在repo,可自定义的任务和Java依赖管理中。

所以我确定的步骤是:

  1. 抓住DynamoDB本地jar
  2. 开始吧
  3. 创建表格
  4. 启动AWS Sam Local API
  5. 我遇到了jar主类无法找到依赖库的问题。这是构建gradle

    SO's code formatting is unusable

    正如您所看到的,我将二进制文件放在构建目录中,以便Gradle可以根据需要清除它,它还包含DynamoDbLocal-1.10.57.jar所需的库,如下所示:

    SO's code formatting is the worst

    以下是Gradle任务的终端堆栈跟踪

    enter image description here

    因此它无法在jar的主运行器中找到org / apache / commons / cli / ParseException类。我不得不使用JDGui打开清单并找到跑步者类的内容所以我也可能不正确?

    apply plugin: 'java'
    
    repositories {
        mavenCentral()
        maven {
            url 'http://dynamodb-local.s3-website-us-west-2.amazonaws.com/release'
        }
    }
    
    def _LIBS = "$buildDir/libs"
    
    defaultTasks 'run'
    
    task copyToLib(type: Copy) {
        doFirst {
            println "Copying libs"
        }
        into _LIBS
        from configurations.runtime
        doLast {
            println "copy complete"
        }
    }
    
    task runDynamoDB(dependsOn: copyToLib, type: JavaExec) {
        doFirst {
            println "Starting DynamoDB local..."
        }
        systemProperty "java.library.path", _LIBS
        classpath sourceSets.main.runtimeClasspath
        main = 'com.amazonaws.services.dynamodbv2.local.main.ServerRunner'
        args "-inMemory", "-sharedDb"
        doLast {
            println "DynamoDB started"
        }
    }
    
    task createTables(dependsOn: runDynamoDB) {
        //aws dynamodb create-table --cli-input-json file://table_config.json --endpoint-url http://localhost:8000
    }
    
    task runSamLocalApi(dependsOn: runDynamoDB) {
        doFirst {
            println "Starting Sam Local API..."
        }
        doLast {
            println "Sam Local API started"
        }
    }
    
    task run(dependsOn: runSamLocalApi) {
        doFirst {
            println "Starting..."
        }
        doLast {
            println "Complete"
        }
    }
    
    dependencies {
        compile 'com.amazonaws:DynamoDBLocal:1.10.+'
        compile fileTree(dir: _LIBS, include: ['*.jar'])
        runtime files(_LIBS + '/DynamoDBLocal-1.10.57.jar')
    }
    

1 个答案:

答案 0 :(得分:1)

=运算符在Groovy中调用set<Field>方法。这就是为什么runDynamoDB任务的类路径只包含一个文件的原因。您应该使用附加到类路径的classpath(Object... paths)

将行更改为以下示例,将文件添加到默认的类路径中:

classpath files(...) // without =

这与systemProperty条目的原理相同,后者也附加到以前的系统属性集合。

请注意,您的构建脚本违反了许多Gradle约定并包含一些问题,这可能会在将来导致错误:

  • 当相应的任务运行时,不会执行您的println语句,但是在配置它们时(无论任务是否运行)。您需要使用doFirstdoLast关闭。
  • 您应该将本地文件依赖项添加到构建脚本(在dependencies部分中),并使用Gradle配置构建类路径,而不是自己收集文件及其路径。