在Gradle构建中使用Ant taskdef和loaderref

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Gradle构建中使用Ant taskdef和loaderref相关的知识,希望对你有一定的参考价值。

我有一个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-export和abc-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构建初始化OK,但运行服务器失败,出现如下错误:

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

我已经尝试了各种Ant路径和引用ID的组合,并将Ant项目类加载器作为loaderref传递。我也试过导入整个Ant构建

ant.importBuild('build.xml') { antTargetName ->
    'ant-' + antTargetName
}

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

答案

我会说这就是这条线

ant.abc-server(...)

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

选项1,删除短划线

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

ant.abcServer(...)

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

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

以上是关于在Gradle构建中使用Ant taskdef和loaderref的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 4.0 hibernatetool taskdef错误

Java 和 ProGuard - 使用类加载器 AntClassLoader 找不到 taskdef 类 proguard.ant.ProGuardTask

读取ant taskdef中的属性文件

原因:未找到类org.apache.tools.ant.taskdefs.optional.XMLValidateTask

尝试比较现有Java Project的Ant构建到Maven或Gradle的迁移吗?

使用 gradle 显示第一个 OSGi 构建 - 从 ant 迁移到 Gradle