通过 ant 任务配置 worklight 数据库时缺少 ant 属性

Missing ant property while configuring worklight database via ant task

我正在将 worklight 6.1 官方部署 ant 任务集成到 gradle 构建脚本中。 我们将利用以下脚本来 运行 灵活的持续集成过程。

def antTaskLibClasspath = "ant-task-lib/worklight-ant-deployer.jar"

def verifyDatabaseArguments(String database){
    switch(project.ext[database + 'Type']){
        case 'derby':
            def dbNameProp = database + 'Name'
            def dbDirPathProp = database + 'Dir'
            def dbProperties = ['databaseName':project.ext[dbNameProp], 'databaseDir':project.ext[dbDirPathProp] ]
                .each { key, value ->
                    if(!value?.trim()){
                        def errMsg = "Missing mandatory parameter : ${key}"
                        println errMsg
                        throw new StopExecutionException(errMsg)
                    }
                }
            project.ext[dbDirPathProp] = Eval.me(""" "${project.ext[dbDirPathProp]}" """).replace("\", "/")
            def dbFile = file(project.ext[dbDirPathProp] + "/${project.ext[dbNameProp]}")
            if(!dbFile.exists()){
                if(dbFile.mkdirs()){
                    println "Create folders ${project.ext[dbDirPathProp]} for ${database} derby database"
                }else {
                    def errMsg = "Can not create folders for ${database} derby database"
                    println errMsg
                    throw new StopExecutionException(errMsg)
                }
            }
            break
        case 'oracle':
            break
        default:
            errMsg = "Unsupported database type"
            println errMsg
            throw new StopExecutionException(errMsg)
            break
        }
    }

    verifyDatabaseArguments("worklightDatabase")
    verifyDatabaseArguments("worklightReportsDatabase") 

    task configure {
    description "Configure database for worklight server"
    doLast {

        ant.typedef(name:'configureDatabase',
            classname:'com.ibm.worklight.config.ant.database.ConfigureDatabaseTask',
            classpath:antTaskLibClasspath
        )

        ant.configureDatabase(kind: "Worklight"){
            switch(worklightDatabaseType){
                case 'derby':
                    derby(database:worklightDatabaseName, datadir:worklightDatabaseDir)
                    break
            }
        }
        ant.configureDatabase(kind: "WorklightReports"){
            switch(worklightReportsDatabaseType){
                case 'derby':
                    derby(database:worklightReportsDatabaseName, datadir:worklightReportsDatabaseDir)
                    break
            }
        }
    }
}

这些是脚本开销中引用的属性。我已将它们设置在 build.gradle 所在的 gradle.properties 中。

worklightDatabaseType=derby

# derby database name
worklightDatabaseName=WRKLGHT
# derby database file directory
worklightDatabaseDir=${System.properties['user.home']}/.derby/ibm

worklightReportsDatabaseType=derby

# derby database name
worklightReportsDatabaseName=WLREPORT
# derby database file directory
worklightReportsDatabaseDir=${System.properties['user.home']}/.derby/ibm

命令行显示 ant 错误消息,在我尝试使用命令 $ > gradle configure.

配置数据库后,我无法弄清楚出了什么问题

第 75 行是我开始第一次调用 ant.configureDatabase( ...

我是否遗漏了 worklight 6.1 中可能未记录的任何强制配置?

我的 jdk 版本是 jdk7_60,gradle 2.4 版没有包装器。 任何suggestion/comment不胜感激,谢谢~

顺便说一句,如果有来自 IBM mobilefirst 团队的顾问在看,
请考虑让您的产品团队重命名名称中带有破折号的 ant 任务。
似乎 Groovy AntBuilder 无法加载 ant 元素名称包含破折号,
所以我们必须解压缩 worklight ant 任务 jar 存档并在 defaults.properties、
中搜索我们需要的任务 class 然后在 gradle 脚本中使用 class 名称手动重新定义 ant 任务。那样不方便。
Worklight 项目的构建过程比较复杂。我们不喜欢使用 ant 来设置构建自动化。


在 Peter post 之后附加他的建议:

谢谢你,彼得。 采用您的方式后,我已经跨过了蚂蚁库问题。 但是它又卡住了,我无法解释错误信息。

起初我假设这个问题是因为 worklight 6.1 ant 部署任务可能与 gradle、
不兼容 所以我在下面写了 ant build 脚本来测试我的假设是否正确,
它实现了与之前的 gradle 脚本相同的构建逻辑和变量。

build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="install">
    <loadproperties srcfile="build.properties" />
    <taskdef resource="com/worklight/ant/defaults.properties">
        <classpath>
            <pathelement location="worklight-ant-task-libs/worklight-ant-deployer.jar"/>
        </classpath>
    </taskdef>
    <target name="configure">
        <configuredatabase kind="Worklight">
            <derby database="${worklightDatabaseName}" datadir="${worklightDatabaseDir}"/>
        </configuredatabase>
        <configuredatabase kind="WorklightReports">
            <derby database="${worklightReportsDatabaseName}" datadir="${worklightReportsDatabaseDir}"/>
        </configuredatabase>
    </target>
</project>

build.properties

# derby database name
worklightDatabaseName=WRKLGHT
# derby database file directory
worklightDatabaseDir=${user.home}/.derby/ibm
# derby database name
worklightReportsDatabaseName=WLREPORT
# derby database file directory
worklightReportsDatabaseDir=${user.home}/.derby/ibm

我的构建进度又失败了。
我已将 ant 错误消息日志文件上传到 google drive.
谁能给我一些建议来帮助我解决这个问题? 谢谢~

我要在这里使用很多猜测,但根据 this section of the Ant Manualant.library.dir 仅由 Ant 的 Launcher class 设置,Gradle的 Ant 集成可能没有使用。

我怀疑您正在使用的 Worklight Ant 任务假设已设置 属性 并抛出异常。您可以通过 运行ning

检查
 gradle --stacktrace configure

假设 configure 是您想要 运行 的任务。这将向您显示从何处抛出异常(以及任何原因)。

您最好将解压缩的 Ant 分发添加到您的源代码树(或者可能只是它的 lib 目录)并将以下条目添加到项目根目录中的 gradle.properties 文件:

systemProp.ant.library.dir=<path to Ant>/lib

当然,您应该将 <path to Ant> 替换为 Ant 安装的实际路径。