gpt4 book ai didi

gradle - Gradle:以编程方式执行子项目中的任务

转载 作者:行者123 更新时间:2023-12-03 05:13:56 25 4
gpt4 key购买 nike

我的WAR文件应包含来自组件的Java源文件。
在我的根项目build.gradle中,我以编程方式在子项目中执行任务:

apply plugin: 'war'

jar.enabled = false
war {
// - Copy Java source files to the folder corresponding to the component;
into("/") { from { collectFilesFromCopyTask('copySourceFiles') } }
}

// Collects files from destinationDirs of copy tasks with matching taskName
def collectFilesFromCopyTask(taskName) {
FileCollection collectedFiles = files{}

// for each task in subprojects
subprojects.each {project ->
project.tasks.withType(Copy).matching { task -> task.name.equals( taskName ) }.each { copyFilesTask ->
println 'copyFilesTask.destinationDir=' + copyFilesTask.destinationDir

// execute task
copyFilesTask.execute()

// add destinationDir of the task to the collected files
collectedFiles += files(copyFilesTask.destinationDir)
}
}

return collectedFiles
}

在子项目中,我有任务:
task copySourceFiles(type: Copy) {
destinationDir = file(project.buildDir.name + '/sourceFiles')

into('componentName') {
from(project.projectDir)
exclude('build')
exclude('bin')
exclude('src/main/webapp')
exclude('.gradle')
}
}

控制台输出:
[sts] -----------------------------------------------------
[sts] Starting Gradle build for the following tasks:
[sts] clean
[sts] build
[sts] -----------------------------------------------------
copyFilesTask.destinationDir=<...>application1\build\sourceFiles
:clean
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:war
copyFilesTask.destinationDir=<...>application1\build\sourceFiles
copyFilesTask.destinationDir=<...>application1\build\sourceFiles
copyFilesTask.destinationDir=<...>application1\build\sourceFiles
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build

,这意味着collectFilesFromCopyTask()被执行4次。
从WAR任务开始只能执行一次。

最佳答案

绝对不要在Gradle中使用任务的.execute()方法。

除了什么时候...... ... no ,永远​​不要这样做。

这不是受支持的事情,并且可能无法按预期工作。

始终使用任务依赖项或任务顺序依赖项来确保运行依赖的任务或任务以特定顺序运行(如果它们都运行,但又不直接相互依赖)。

使war任务依赖于复制任务,并使war任务使用这些任务的输出(而不是手动files(...)调用)。

编辑:

war {
into("/") { from { subprojects.tasks*.findByName('copySourceFiles').findAll { it instanceof Copy } } }
}

关于gradle - Gradle:以编程方式执行子项目中的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36942433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com