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 回答
一旦你写
你将定义createAllExecutables任务和shadowJar之间的依赖关系,这意味着每次Gradle决定调用
createAllExecutables
(例如,因为你将它传递给命令行,或其他任务将取决于它)shadowJar
也将被添加到任务图 . 因此,在这种情况下,当您调用gradle createAllExecutables
时,shadowJar
也将被执行 .但你也可以写
在这种情况下,您不会在任务之间引入任何依赖关系,但您将在Gradle中检查这两个任务的预期顺序 . 在这种情况下,一旦调用
gradle createAllExecutables
,shadowJar
将不会被执行 .我认为
dependsOn
关系在你的情况下更适用,因为为了创建可执行文件你需要已经有胖jar,所以它依赖于关系,而不是必须运行 .