Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gradle:在自定义任务类中使用其他(非官方)任务?_Java_Groovy_Gradle - Fatal编程技术网

Java Gradle:在自定义任务类中使用其他(非官方)任务?

Java Gradle:在自定义任务类中使用其他(非官方)任务?,java,groovy,gradle,Java,Groovy,Gradle,假设我想在buildSrc/src/main/groovy/JDKDownloader.groovy中编写一个定制的Gradle任务,它可以下载任何版本的JavaJDK。它看起来像这样: class JDKDownloader extends DefaultTask { String version = getLatestJDKVersion() String dest = null; @TaskAction def download() { .

假设我想在
buildSrc/src/main/groovy/JDKDownloader.groovy
中编写一个定制的Gradle任务,它可以下载任何版本的JavaJDK。它看起来像这样:

class JDKDownloader extends DefaultTask {
    String version = getLatestJDKVersion()
    String dest = null;

    @TaskAction
    def download() {
        .. code to download JDK ..
    }

    private String getLatestJDKVersion() {
        .. code to find latest JDK version ..
    }
}
task downloadJDK16(type: JDKDownloader) {
    version = '1.6'
    dest = 'jdkDownload'
}
download {
    src: 'someurl'
    dest: 'somedir'
}
可以这样使用:

class JDKDownloader extends DefaultTask {
    String version = getLatestJDKVersion()
    String dest = null;

    @TaskAction
    def download() {
        .. code to download JDK ..
    }

    private String getLatestJDKVersion() {
        .. code to find latest JDK version ..
    }
}
task downloadJDK16(type: JDKDownloader) {
    version = '1.6'
    dest = 'jdkDownload'
}
download {
    src: 'someurl'
    dest: 'somedir'
}
现在,问题是:对于这个具体的例子,我想使用Gradle下载插件,因为它在下载文件时显示了一个很好的进度显示。但是如何在JDKDownloader中以适当的方式使用这个插件/任务呢?在普通渐变脚本中,必须执行以下操作:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'de.undercouch:gradle-download-task:0.5'
    }
}
之后可以这样使用它:

class JDKDownloader extends DefaultTask {
    String version = getLatestJDKVersion()
    String dest = null;

    @TaskAction
    def download() {
        .. code to download JDK ..
    }

    private String getLatestJDKVersion() {
        .. code to find latest JDK version ..
    }
}
task downloadJDK16(type: JDKDownloader) {
    version = '1.6'
    dest = 'jdkDownload'
}
download {
    src: 'someurl'
    dest: 'somedir'
}
但是,我们如何从
JDKDownloader
实现这一点呢?显然,要求类的用户自己应用下载插件,然后才能使用
JDKDownloader
(丑陋的隐式依赖),这不是一个很好的解决方案。另一方面,
JDKDownloader
会弄乱调用脚本的buildscript依赖项,这似乎很奇怪


那么,有没有更好的方法来实现这一点呢?

如果您将插件发布为Maven或Ivy模块,可传递的依赖关系管理将处理其依赖关系。

但是,如果我只想使用自定义任务类作为容器来保持整洁,而不是构建一个用于其他模块的插件,该怎么办?因此,我没有将所有JDK下载函数都放在build.gradle中,而是将它们放入JDKDownloader抽象中。然后,下载插件在
buildSrc/build.gradle
中成为常规编译或运行时依赖项,我想就是这样。