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

Gradle:以编程方式在子项目中执行任务

瞿健
2023-03-14

我的WAR文件应该包含来自组件的Java源文件。在我的根项目构建中。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任务开始,只能执行一次。

共有1个答案

施自明
2023-03-14

永远不要在Gradle中使用任务的。执行()方法。

除非。。。。。。不,永远不要那样做。

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

始终使用任务依赖项或任务排序依赖项来确保相关任务或任务都按特定顺序运行(如果两者都运行,但不直接相互依赖)。

使您的war任务取决于您的复制任务,并使您的war任务使用这些任务的输出(而不是手动文件(…) 调用)。

编辑:

war {
 into("/") { from { subprojects.tasks*.findByName('copySourceFiles').findAll { it instanceof Copy } } } 
}
 类似资料:
  • 我有一个这样的多项目构建 现在,在项目中,我已经为所有子项目声明了一个任务,如下所示: 当我运行时,我得到的输出类似于以下内容(其他内容): 现在,我尝试像这样为简单项目运行该任务 我得到的输出是: 失败:构建失败,但有一个异常。 > 哪里出错了:在项目中找不到任务你好:例子:简单项目。一些候选人是:帮助。 尝试:运行gradle任务以获取可用任务的列表。使用--stack跟踪选项来获取堆栈跟踪。

  • 我希望在编译任何子项目之前先执行protobuf任务,因为我的子项目依赖于从protobuf任务生成的java文件。那么我怎样才能做到这一点呢?我不想在每个子项目中都有protobuf任务,相反,我只想在根项目中同时完成它,但在编译子项目之前。

  • 我已经设置了一个Gradle任务来自动生成Gradle构建中的一个子项目,另一个子项目依赖于该子项目(这样做的原因:涉及Apache Cordova的故事很长!)。因此,根构建。gradle包含此自动生成任务,该任务创建“CordovaLib”子项目。构建。另一个子项目(非自动生成)中的gradle依赖于CordovaLib: 有没有办法在评估未生成的子项目的build.gradle之前执行自动生

  • 我面临以下问题。我有一个多模块的Gradle项目。一个模块是我的根项目,第二个模块是集成测试。 为了让我的集成测试运行,复制任务需要首先运行,以便将一些资产移动到项目根目录上的文件夹中。 我已经在我的根项目上定义了这样一个任务,当我试图调用它时,它什么也不做(我尝试了几种不同的调用方式)。 由于失败,我继续在子项目本身上创建了以下任务: 这是我的另一个任务。我的目标是让它将根项目类以及在下生成的j

  • 我正在使用以下项目结构 子模块包含在设置中。gradle,并在内部版本中配置。根项目的渐变。 我有3个任务要做 (每个子项目都有这个) (这是每个子项目都需要自己工作的打包机制) (这只需要调用一次) 我想能够打电话 $gradle部署 build.gradle

  • 我有以下多模块项目结构。 当我为/builder子项目运行任务时,我希望所有子项目都会执行任务(对于