首页 文章

Gradle:'clone'原始jar任务为包含依赖项的jar创建新任务

提问于
浏览
8

我想在我的项目中创建一个新任务,创建一个jar存档,其中包含项目的类文件和依赖项的类文件(也称为“shaded jar”或“fat jar”) .

Gradle cookbook提出的解决方案修改了JavaPlugin的标准jar任务:

jar {
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

但是,我想保留原始的jar文件并为shaed jar创建一个额外的任务,即一个行为与jar任务完全相同的任务,但包括附加的文件根据

from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }

并有另一个分类器('阴影') .

我试图通过复制这样的属性来接管jar任务的配置:

task shadedJar(type: Jar, dependsOn: configurations.compile) {
    dependencies = tasks.jar.taskDependencies
    source = tasks.jar.source
    manifest = tasks.jar.manifest
    includes = tasks.jar.includes
    classifier = 'shaded'

    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

但是生成的任务不会接管'jar'的依赖关系,并且生成的jar不包含项目的类文件 . 此外,这种方法似乎很麻烦,无法成为将现有任务用作新任务的模板的推荐方法 .

对于我的特定需求(单独的shadedJar任务)和“克隆”任务,可以使用什么方法将它们用作一般其他任务的模板?

(我目前仍在使用Gradle 1.3,但欢迎使用当前Gradle版本的解决方案)

1 回答

  • 8

    克隆任务没有内置方法 . 但是,很容易配置 fatJar 任务以包含与 java 插件的 jar 任务相同的文件:

    task fatJar(type: Jar) {
        appendix = "fat"
        from sourceSets.main.output // that's it
        from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    }
    

    任务自动装配将自动 Build 必要的任务依赖性 .

    如果构建脚本继续自定义 jar 任务,则可以同时将自定义应用于这两个任务:

    configure([jar, fatJar]) {
        version = "2.0"
        entryCompression = "STORED"
    }
    

    如果,与 jar 任务的情况不同,您自己定义"template",可以使用工厂方法"instantiate":

    def getMeAnotherOne(String name) {
        task(name, type: Jar) {
           version = "2.0"
           entryCompression = "STORED"
        }
    }
    
    getMeAnotherOne("jar1")
    getMeAnotherOne("jar2")
    

相关问题