请注意:虽然我在这里特别提到了两个Gradle插件,但这是100%关于理解Gradle中的任务依赖关系的问题,并且不需要了解个别插件(我认为)!
我有一个项目将使用两个Gradle插件:
java -jar myapp.jar
而不必管理jar的外部类路径等)。这将在build/libs/myapp.jar
产生一个胖罐;和这是我的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
声明吗?或者,如果任务 以正确的顺序执行,可能会提供有关导致错误的原因的任何想法?
答案 0 :(得分:1)
一旦你写完
createAllExecutables.dependsOn shadowJar
您将定义createAllExecutables任务和shadowJar之间的依赖关系,这意味着每次Gradle决定调用createAllExecutables
时(例如,因为您将其传递给命令行,或其他任务将取决于它){ {1}}也将添加到任务图表中。因此,在您调用shadowJar
的情况下,gradle createAllExecutables
也将被执行。
但你也可以写
createAllExecutables.mustRunAfter shadowJar
在这种情况下,您不会在任务之间引入任何依赖关系,但您将在Gradle中检测这两个任务的预期顺序。在这种情况下,一旦您调用shadowJar
,gradle createAllExecutables
将无法执行。
我认为shadowJar
关系更适用于您的情况,因为为了创建可执行文件,您需要已经使用胖jar,因此它依赖关系,不必须在之后运行。