多个 Gradle 插件任务的排序依赖
Sequencing dependencies of multiple Gradle plugin tasks
请注意:虽然我在这里特别提到了两个 Gradle 插件,但这 100% 是一个关于理解 Gradle 中任务依赖关系的问题,并且确实不需要 了解各个插件(我认为)!
我有一个项目将使用两个 Gradle 插件:
- Gradle Shadow plugin,它将产生一个独立的 "fat jar"(基本上是一个大罐子,包含我所有的 类 加上我所有的传递依赖项的 类,这样我就可以 运行
java -jar myapp.jar
而无需管理 jar 的外部类路径等)。这将在 build/libs/myapp.jar
处产生一个 fat jar;和
- Gradle Launch4J plugin,它在后台使用 Launch4J 将 jar 转换为本机可执行文件(EXE 等)。 显然必须在 Launch4J 任务之前创建 fat jar 运行,否则他们将没有任何东西可以包装在 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(在shadowJar
运行s时调用)然后然后 让 Launch4J 启动(在 createAllExecutables
运行s 时调用)。但是当我 运行 时,我得到以下异常:
: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
声明来正确排序我的任务吗?或者,如果任务 以正确的顺序执行,也许可以提供有关导致错误的原因的任何想法?
一旦你写
createAllExecutables.dependsOn shadowJar
您将定义 createAllExecutables 任务和 shadowJar 之间的依赖关系,这意味着每次 Gradle 决定调用 createAllExecutables
(例如,因为您将其传递给命令行,否则其他任务将依赖在它上面)shadowJar
也将被添加到任务图中。所以在这种情况下,当你调用 gradle createAllExecutables
时,shadowJar
也会被执行。
不过你也可以这样写
createAllExecutables.mustRunAfter shadowJar
在这种情况下,您不会在任务之间引入任何依赖关系,但您将检测 Gradle 这两个任务的预期顺序。在这种情况下,一旦您调用 gradle createAllExecutables
,shadowJar
将不会被执行。
我认为 dependsOn
关系更适用于你的情况,因为为了创建可执行文件你需要已经有 fat jar,所以它是 depend关系,不是 必须 运行 在 .
之后
请注意:虽然我在这里特别提到了两个 Gradle 插件,但这 100% 是一个关于理解 Gradle 中任务依赖关系的问题,并且确实不需要 了解各个插件(我认为)!
我有一个项目将使用两个 Gradle 插件:
- Gradle Shadow plugin,它将产生一个独立的 "fat jar"(基本上是一个大罐子,包含我所有的 类 加上我所有的传递依赖项的 类,这样我就可以 运行
java -jar myapp.jar
而无需管理 jar 的外部类路径等)。这将在build/libs/myapp.jar
处产生一个 fat jar;和 - Gradle Launch4J plugin,它在后台使用 Launch4J 将 jar 转换为本机可执行文件(EXE 等)。 显然必须在 Launch4J 任务之前创建 fat jar 运行,否则他们将没有任何东西可以包装在 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(在shadowJar
运行s时调用)然后然后 让 Launch4J 启动(在 createAllExecutables
运行s 时调用)。但是当我 运行 时,我得到以下异常:
: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
声明来正确排序我的任务吗?或者,如果任务 以正确的顺序执行,也许可以提供有关导致错误的原因的任何想法?
一旦你写
createAllExecutables.dependsOn shadowJar
您将定义 createAllExecutables 任务和 shadowJar 之间的依赖关系,这意味着每次 Gradle 决定调用 createAllExecutables
(例如,因为您将其传递给命令行,否则其他任务将依赖在它上面)shadowJar
也将被添加到任务图中。所以在这种情况下,当你调用 gradle createAllExecutables
时,shadowJar
也会被执行。
不过你也可以这样写
createAllExecutables.mustRunAfter shadowJar
在这种情况下,您不会在任务之间引入任何依赖关系,但您将检测 Gradle 这两个任务的预期顺序。在这种情况下,一旦您调用 gradle createAllExecutables
,shadowJar
将不会被执行。
我认为 dependsOn
关系更适用于你的情况,因为为了创建可执行文件你需要已经有 fat jar,所以它是 depend关系,不是 必须 运行 在 .