当前位置: 首页 > 知识库问答 >
问题:

多个Gradle插件任务的相关性排序

国俊艾
2023-03-14

请注意:虽然我在这里特别提到了两个Gradle插件,但这完全是一个关于理解Gradle中任务依赖性的问题,不需要任何关于单个插件的知识(我认为)!

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

    < Li > Gradle Shadow插件,它将生成一个自包含的“fat jar”(基本上是一个包含我的所有类以及我的所有可传递依赖项的类的大jar,这样我就可以运行< code>java -jar myapp.jar,而不必管理jar的外部类路径等。).这将在< code > build/libs/myapp . jar 生成一个fat jar和 < Li > grad le Launch4J插件,它使用launch 4j将jar转换为本机可执行文件(EXE等)。).显然,fat jar必须在Launch4J任务运行之前创建,否则在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

这里的意图是,我希望首先创建fat jar(在< code>shadowJar运行时调用),然后启动4J(在< code > 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任务之前触发的,因此没有任何东西(没有胖罐)可以捆绑在EXE中。

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

共有1个答案

裴学
2023-03-14

一旦你写了

createAllExecutables.dependsOn阴影罐

您将定义createAllExecutables任务和shadowJar之间的依赖关系,这意味着每次Gradle决定调用<code>CreateAlleExecutables</code>(例如,因为您将其传递到命令行,否则其他任务将依赖它)<code>shadowJar</code>也将添加到任务图中。因此,在这种情况下,当您调用gradle createAllExecutables时,也将执行shadowJar

但是你也可以写

createAllExecutables。必须在暗影罐后运行

在这种情况下,你不会在任务之间引入任何依赖关系,但是你会告诉Gradle这两个任务的预期顺序。在这种情况下,一旦调用< code > gradle createAllExecutables ,就不会执行< code>shadowJar。

我认为 dependsOn 关系更适用于您的情况,因为为了创建可执行文件,您需要已经有胖 jar,因此这取决于关系,而不是必须运行。

 类似资料:
  • 我有什么? 现在我想知道在任务执行之前是否可以使用clean task(常见的构建任务)来清理构建目录。 这背后是有原因的,我想确保每次gradle都应该编译java文件,并且所有.class文件都应该被刷新(这是一些要求) 我试过什么? 我想知道什么? 有没有什么方法可以避免编写包装器任务,并做一些梯度魔术来达到要求?

  • 1.11级给我一个弃用警告: Gradle2.0的构建失败: 我已经按照http://www.cradle.org/docs/current/userguide/java_plugin.html#sec%3asource_sets中的描述定义了源集,这样做是因为我的项目没有遵循默认的项目布局。 我确实定义了一些依赖项,但没有定义;这只是一个简单的枚举,用作代码生成的基础。它没有依赖关系。即使我像下

  • 我有一个任务列表,它们之间有依赖关系,我正在考虑如何使用JGraphT来管理任务的顺序。我会将图形设置为有向图,并在处理顶点时删除顶点(或者我应该屏蔽它们吗?如果我一次只执行一个任务,我可以使用,但我希望并行化这些任务。我可以获取并检查直到我找到尽可能多的我想要执行一次,但理想情况下,会有像这样的东西。我看到Netflix提供了一个获取叶顶点的实用程序,所以我可以反转图形并使用它,但它可能不值得。

  • 我正在尝试创建一个自定义任务/插件(两者都拒绝工作),用于我的gradle构建脚本。 我正在使用groovy插件,希望在单独的文件中声明任务/插件,而不是在我的构建中。格拉德尔。 我的项目树如下所示: 我试图做的是在中创建我的任务/插件类,然后在。 让我举一个小例子。 TestTask。groovy: build.gradle 当我尝试使用我的gradle.build(清洁,构建等)做任何事情时,

  • 我最近开始实现Gradle发布插件。我已经经历了https://github.com/researchgate/gradle-release#custom-释放步骤。 该插件正在将SNAPSHOT版本更新为发布版本,将当前SNAPSHOT版本更新为下一个版本。gradle发布任务也在执行编译、构建步骤。我在Jenkins中自动执行了此操作。我尝试了“构建任务 = []" 但构建任务仍已执行。我找不