【问题标题】:Using Ant taskdef and loaderref in Gradle build在 Gradle 构建中使用 Ant taskdef 和 loaderref
【发布时间】:2018-09-11 18:39:55
【问题描述】:

我有一个 Ant 版本,我想转换为 Gradle。 Ant 构建使用了一些自定义任务。 Ant build.xml 看起来像

<project name="proj" basedir=".">
    <property name="abc.path" value="lib/abc-ant.jar"/>
    <taskdef resource="com/abc/antlib.xml" classpath="${abc.path}" loaderref="abc"/>
</project>

jar 中的 antlib.xml 文件看起来像

<antlib>
    <taskdef name="abc-server" loaderref="abc" classname="com.abc.ant.Server"/>
    <taskdef name="abc-export" loaderref="abc" classname="com.abc.ant.Export"/>
    <taskdef name="abc-import" loaderref="abc" classname="com.abc.ant.Import"/>
</antlib>   

loaderref 很重要,因为 abc-exportabc-import 任务在内部调用 abc-server。我的 build.gradle 看起来像

apply plugin: 'groovy'

ant.property(name: 'abc.path', value: 'lib/abc-ant.jar')

ant.taskdef(resource: "com/abc/ant/antlib.xml", classpath: ant.properties['abc.path'], loaderref: 'abc')

task server(group: "abc") {
    doLast {
        ant.abc-server(id: "id", url: 'https://www.example.com/', user: 'user@abc.com', password: 'xxx')
    }
}

gradle 构建初始化正常,但运行 server 失败,并出现如下错误:

> No such property: abc for class: org.gradle.api.internal.project.DefaultAntBuilder

我尝试了各种 Ant 路径和引用 ID 的组合,并将 Ant 项目类加载器作为 loaderref 传递。我还尝试使用

导入整个 Ant 构建
ant.importBuild('build.xml') { antTargetName ->
    'ant-' + antTargetName
}

但没有运气。有谁知道如何进行这项工作?

【问题讨论】:

    标签: gradle ant


    【解决方案1】:

    我会说是这条线

    ant.abc-server(...)
    

    就像 Java 一样,Groovy 方法名称不能包含“-”字符。

    选项 1,删除破折号

    <taskdef name="abcServer" loaderref="abc" classname="com.abc.ant.Server"/>
    
    ant.abcServer(...)
    

    选项 2,用引号将方法名称括起来

    ant.'abc-server'(...)
    

    【讨论】:

    • 谢谢。我无法控制 jar,但 ant.'abc-server'(...) 有效
    猜你喜欢
    • 2017-12-17
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2011-11-07
    • 1970-01-01
    相关资源
    最近更新 更多