-6

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

所以我确定的步骤是:

  1. 获取 DynamoDB 本地 jar
  2. 启动它
  3. 创建表
  4. 启动 AWS Sam 本地 API

我遇到了 jar 主类无法找到依赖库的问题。这是构建gradle

SO的代码格式不可用

如您所见,我将二进制文件放在构建目录中,以便 Gradle 可以根据需要对其进行清理,Gradle 还包含所需的库以及 DynamoDbLocal-1.10.57.jar,如下所示:

SO的代码格式最差

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

在此处输入图像描述

所以它无法在 jar 的主运行器中找到 org/apache/commons/cli/ParseException 类。我必须使用 JDGui 打开清单并找到 runner 类是什么,所以我也可能不正确?

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')
}
4

1 回答 1

1

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

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

classpath files(...) // without =

它与条目的原理相同systemProperty,它也附加到先前的系统属性集合中。


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

  • 您的println语句不会在相应任务运行时执行,而是在配置时执行(无论任务是否运行)。你需要使用doFirstdoLast闭包。
  • 您应该将本地文件依赖项添加到您的构建脚本(在该dependencies部分中)并使用 Gradle 配置来构建您的类路径,而不是自己收集文件及其路径。
于 2018-02-27T22:09:08.570 回答