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

标签 gradle

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

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

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

但是,我想保持原始 jar 任务不变,并为 shaeded 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 版本的解决方案)

最佳答案

没有内置的方法来克隆任务。但是,可以轻松配置 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) } }
}

任务 Autowiring 将自动建立必要的任务依赖关系。

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

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

如果与 jar 任务的情况不同,您自己定义"template",则可以使用工厂方法“实例化”它:

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

getMeAnotherOne("jar1")
getMeAnotherOne("jar2")

关于Gradle: 'clone' 原始 jar 任务,用于为包含依赖项的 jar 创建新任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16376329/

相关文章:

java - 如何从 IntelliJ IDEA 中使用 Gradle 运行主要方法?

android - Bitmovin 和 Exoplayer 依赖项冲突

android - Gradle不编译依赖项

Grails 3.3.2 - gradlew bootRun 有效,但 grails run-app 和 grails-compile 无效

javadoc - 无法使用gradle将overview.html导入javadoc

gradle - liquibase gradle不提交更改

android - org.gradle.api.InvalidUserCodeException : Querying the mapped value of provider (java. util.Set) before task ... 已完成不支持

android - 在Android Studio中设置gradle的proxyHost

java - Gradle 的 New Relic Android 代理错误

intellij-idea - IntelliJ不断恢复我的更改吗?