首页 文章

排序多个Gradle插件任务的依赖关系

提问于
浏览
0

Please note: 虽然我在这里特别提到了两个Gradle插件,但这是100%关于理解Gradle中任务依赖关系的问题,并且不需要任何关于单个插件的知识(我认为)!


我有一个项目将使用两个Gradle插件:

  • Gradle Shadow plugin,它将生成一个自包含的"fat jar"(基本上是一个包含我所有类的大jar加上我所有传递依赖的类,然后允许我只需运行 java -jar myapp.jar 而无需管理jar的外部类路径等) . 这将在 build/libs/myapp.jar 产生一个胖 jar ;和

  • Gradle Launch4J plugin,它使用Launch4J将jar转换为本机可执行文件(EXE等) . Obviously the fat jar has to be created prior to the Launch4J tasks run, otherwise they'll have nothing to wrap inside of an EXE!

这是我的 build.gradle

import com.github.jengelman.gradle.plugins.shadow.transformers.ServiceFileTransformer

plugins {
    id 'groovy'
    id 'application'
    id 'maven-publish'
    id 'com.github.johnrengelman.shadow' version '1.2.3'
    id 'edu.sc.seis.launch4j' version '2.3.0'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

group = 'hotmeatballsoup'
mainClassName = 'com.me.myapp.Driver'

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    compile(
        'org.codehaus.groovy:groovy-all:2.4.7'
        ,'org.slf4j:slf4j-api:1.7.24'
        ,'org.slf4j:slf4j-simple:1.7.24'
    )
}

manifest {
    attributes 'Main-Class': mainClassName
}
jar {
    manifest {
        attributes 'Main-Class': mainClassName
    }
    baseName = 'zimbus'
}

shadowJar {
    transform(ServiceFileTransformer) {
        exclude 'META-INF/*.DSA'
        exclude 'META-INF/*.RSA'
        exclude 'LICENSE*'
    }
    transform(com.github.jengelman.gradle.plugins.shadow.transformers.AppendingTransformer) {
        resource = 'reference.conf'
    }
    classifier = ''
}

publishing {
    publications {
        shadow(MavenPublication) {
            from components.shadow
            artifactId = 'zimbus'
        }
    }
}

launch4j {
    outfile = 'zimbus.exe'
    mainClassName = 'com.me.myapp.Driver'
    icon = 'zimbus.ico'
    jar = 'build/libs/gradle-launch4j-example.jar'
}

在命令行我运行:

./gradlew clean build shadowJar createAllExecutables

这里的意图是我想首先创建胖jar(在 shadowJar 运行时调用),然后启动Launch4J(在 createAllExecutables 运行时调用) . 但是当我运行它时,我得到以下异常:

:createExe FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':createExe'.
> Launch4J finished with non-zero exit value 1
  launch4j: Application jar doesn't exist.

我很确定 createAllExecutables 任务在 shadowJar 任务之前被触发,因此没有任何东西(没有胖 jar )在EXE内部捆绑 .

有人可以证实我的怀疑,并帮助我定义将正确命令我的任务的 dependsOn 声明吗?或者,如果任务以正确的顺序执行,可能会提供有关导致错误的原因的任何想法?

1 回答

  • 1

    一旦你写

    createAllExecutables.dependsOn shadowJar

    你将定义createAllExecutables任务和shadowJar之间的依赖关系,这意味着每次Gradle决定调用 createAllExecutables (例如,因为你将它传递给命令行,或其他任务将取决于它) shadowJar 也将被添加到任务图 . 因此,在这种情况下,当您调用 gradle createAllExecutables 时, shadowJar 也将被执行 .

    但你也可以写

    createAllExecutables.mustRunAfter shadowJar

    在这种情况下,您不会在任务之间引入任何依赖关系,但您将在Gradle中检查这两个任务的预期顺序 . 在这种情况下,一旦调用 gradle createAllExecutablesshadowJar 将不会被执行 .

    我认为 dependsOn 关系在你的情况下更适用,因为为了创建可执行文件你需要已经有胖jar,所以它依赖于关系,而不是必须运行 .

相关问题