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

为什么gradle任务不能按正确的顺序运行

姬温文
2023-03-14

我有2个子项目的java项目。像这样的结构

- project_root
  |- client
     |- src
     |- build.gradle
  |- server
     |- src
     |- build.gradle
  |- build.gradle

我只需要在root buiild.gradle中创建'deploy'任务,然后执行以下操作:

    null
allprojects {
    apply plugin: 'java'
    repositories {
        mavenCentral()
    }
}

task cleanTarget(type: Delete) {
    delete "target"
    delete "target.zip"
}

task cleanAll() {
    dependsOn cleanTarget
    dependsOn clean
    dependsOn subprojects.clean
}

task jarChilds() {
    dependsOn subprojects.jar
}

task copyFiles(type: Copy) {
    copy {
        from("client/build/libs/")
        into project.file('target')
    }
    copy {
        from("server/build/libs/")
        into project.file('target')
    }
}

task zipApp(type: Zip) {
    from 'target/'
    include '*'
    include '*/*'
    archiveName 'target.zip'
    destinationDir(project.rootDir)
}

task deploy{
    dependsOn cleanAll
    dependsOn jarChilds
    dependsOn copyFiles
    dependsOn zipApp
    jarChilds.shouldRunAfter cleanAll
    copyFiles.shouldRunAfter jarChilds
    zipApp.shouldRunAfter copyFiles
}
Executing task 'deploy'...

> Task :clean
> Task :cleanTarget
> Task :client:clean
> Task :server:clean
> Task :cleanAll
> Task :client:compileKotlin
> Task :client:compileJava
> Task :client:processResources
> Task :client:classes
> Task :client:inspectClassesForKotlinIC

> Task :client:jar
Client jar done

> Task :server:compileKotlin
> Task :server:compileJava
> Task :server:processResources
> Task :server:classes
> Task :server:inspectClassesForKotlinIC

> Task :server:jar
Server jar done

> Task :jarChilds
> Task :copyFiles NO-SOURCE
> Task :zipApp NO-SOURCE
> Task :deploy


BUILD SUCCESSFUL in 3s
14 actionable tasks: 14 executed
12:39:15: Task execution finished 'deploy'.

我看到错误“no-source”,但是文件夹“client/build/libs”和“server/build/libs”存在并包含jar。我可以肯定,因为手动运行任务‘复制文件’创建文件夹‘目标’和复制所有文件。我看到的唯一可能的选项是“复制文件”任务在“jar childs”之前运行。但我不明白为什么。我错过了什么,为什么不起作用?

对不起,我的英语不好

共有1个答案

彭宏深
2023-03-14

您的任务copyfiles使用项目实例的方法copy而不是配置实际任务。这就是为什么任务保持未配置状态,并且一旦执行,就报告没有文件要处理(no-source)。若要配置任务,请使用任务类型copy的方法:

task copyFiles(type: Copy) {
    from("client/build/libs/")
    from("server/build/libs/")
    into("target")
}

附加提示:您可能根本不需要任务copyfiles。相反,您可以使用任务zipapp来收集文件:

task zipApp(type: Zip) {
    from subprojects.jar
    archiveName 'target.zip'
    destinationDir(project.rootDir)
}

通过将子项目JAR任务放入from方法,Gradle甚至可以自动添加任务依赖项,因此您不需要使用dependson注册它们。

请查看以下简短完整的build.gradle文件:

subprojects {                    // using subprojects here, because your root project has no sources
    apply plugin: 'java'
    repositories {
        mavenCentral()
    }
}

task clean(type: Delete) {       // without the 'java' plugin, there is no automatic 'clean' task
    dependsOn subprojects.clean
    delete 'target.zip'
}

task zipApp(type: Zip) {
    mustRunAfter clean
    from subprojects.jar
    archiveName 'target.zip'
    destinationDir(project.rootDir)
}

task deploy {
    dependsOn clean
    dependsOn zipApp
}
 类似资料:
  • 我有一个文件,看起来像这样 wsimport任务从wsdl文件生成所需的一些java文件。生成需要一些时间,所以我不希望每次构建jar或编译程序时都执行它。 wsclean任务旨在当wsdl发生更改时使用。 首先,我运行wsimport任务并确认文件生成正确,它们就是! 但是现在,当我运行gradle jar时,生成的文件被删除了。为什么? 当我注释掉wsclean任务时,jar任务成功地继续。为

  • 问题内容: 我有一个导航栏作为地图: 其中具有各种属性,子项等。当我尝试渲染导航栏(带有)时,它以随机顺序显示。我知道它在运行时会随机排序,但是似乎无法获取有序的键列表或按插入顺序进行迭代。 游乐场链接位于此处:http : //play.golang.org/p/nSL1zhadg5,尽管它似乎没有表现出相同的行为。 如何在不破坏插入顺序的情况下迭代此映射? 问题答案: Go地图不保持插入顺序;

  • 本文向大家介绍js为什么不能正确处理小数运算?,包括了js为什么不能正确处理小数运算?的使用技巧和注意事项,需要的朋友参考一下 上面的程序会输出1吗? 在 你有必要知道的 25 个 JavaScript 面试题 一文中,第 8 个题浅显的说了下 js 为什么不能正确处理小数运算的问题。今天重拾旧题,更深层次的剖析下这个问题。 但要先说明的是,不能正确处理小数的运算并不是 JavaScript 语言

  • 我是格拉德尔的新信徒。大多数任务都很好。然而,我看到战争任务总是被跳过。在调试模式下运行时,我会看到以下日志- 09:12:34.889[LIFECYCLE][类org.gradle.internal.buildevents.TaskExuretionLogger]: war09:12:34.889[DEBUG][org.gradle.api.internal.tasks.execution.Ex

  • 现在我正在学习C++我做了我的第一个小程序加法计算器,我写两个数字,它把它们相加。你能告诉我为什么我的输出是0吗? 输出:

  • 所以,我正在为一个班级做这个作业。这是一个Java类,我应该做一个游戏,它掷两个骰子,把它们相加,然后把它们加到你的回合分数上。然后它会问你是否想继续玩下去。当你的轮次得分达到20分,或者当你决定通过时,它会进入电脑。它应该打印每个回合的分数,然后当有人得到100分时,它就会宣布胜利者。然而,不管怎样,无论我跑了多少圈,每一圈结束时的分数都是0。当一名玩家掷1时,他们的回合分数被取消,并转移到另一