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

Gradle,dependsOn排序

梁承恩
2023-03-14

被分级点餐弄糊涂了。我是一个新手,以前在构建中使用过Ant,有过使用Gradle的经历,这可能会解释一些问题

简要背景(以防有人问“你为什么这么做”)。我们在war文件中提供了一个Java WebStart应用程序。Java7(从-40开始)正在提示用户关于缺少元素的格式不正确的jar文件。我想自动化一个获得战争的过程;从“bin”文件夹中提取JavaWS的JAR;向清单中添加元素稍后我将重新签名JAR并重新组装war,但现在我只想添加清单条目。

我的问题是,我定义了具有依赖元素的任务,但任务似乎以错误的顺序运行(参见下面的gradle文件)。我期望的是任务按顺序运行:delete dir;发动战争;解除战争;向JAR中添加元素。我看到的(从日志文件)是:元素被添加到jar,这实际上创建了一个新的jar,dir被删除,war被取消war,所以我最终得到了原始的war文件内容。

我检查了:Gradle任务来按顺序调用其他任务,但是,我似乎根本无法使用mustRunAfter,可能与我拥有的Gradle版本相关,但无论如何,我并不真的想要控制不同任务的顺序,我更喜欢(在我基于蚂蚁的思维中),我可以通过让任务相互依赖来定义我想要的顺序。

有人能看到我的构建文件中的缺陷吗?注意:如果我从辞职ClientJars任务中删除“dependson”,并在运行其他任务后手动运行它,那么它就会正常工作,并且我会使用清单中的新元素获得我的jars,因此我有一个可行的解决方法,但我更希望知道我在这里做错了什么。

task (deletework, type: Delete) {
    delete 'workYYY'
}

task (getlaganwar, type: Copy, dependsOn: deletework) {
    from "d:/dev/v8-0-5/wars"
    into "workYYY"
    include 'lagan.war'
}

task (unwar, type: Copy, dependsOn: getlaganwar) {
    from zipTree(file('workYYY/lagan.war'))
    into file("workYYY/lagan")
}

task (resignclientjars, type: Copy, dependsOn: unwar) {
//task (resignclientjars, type: Copy) {

//  mustRunAfter unwar

    def workDir = file("workYYY/lagan")
    def binDir = file(new File(workDir, "bin"))

    def collection = files { binDir.listFiles() }
    collection.each { 
        File jarFile = new File(binDir, it.name)
        ant.echo(message: "updating:${jarFile.absolutePath}")
        ant.jar(jarfile: jarFile, update: 'true') {
            manifest {
                attribute(name: 'Implementation-Title', value: 'Lagan Enterprise')
                attribute(name: 'Implementation-Vendor', value: 'Lagan Enterprise')
                attribute(name: 'Implementation-Version', value: 'Lagan Enterprise')
                attribute(name: 'Application-Name', value: 'Lagan Enterprise')
                attribute(name: 'Permissions', value: 'all-permissions')
            }
        }
    }
}

//unwar.mustRunAfter getlaganwar
//getlaganwar.mustRunAfter deletework
//resignclientjars.mustRunAfter getlaganwar

调试输出包含以下内容:

[sts] -----------------------------------------------------
[sts] Starting Gradle build for the following tasks: 
[sts]      :resignclientjars
[sts] -----------------------------------------------------

12:06:19.658 [WARN] [org.gradle.api.internal.project.ant.AntLoggingAdapter] [ant:echo] updating:D:\dev\util\java7-clientjars\workYYY\lagan\bin\DebugWinIEBrowser.jar
12:06:19.666 [WARN] [org.gradle.api.internal.project.ant.AntLoggingAdapter] [ant:echo] updating:D:\dev\util\java7-clientjars\workYYY\lagan\bin\DebugWinMSWord.jar
12:06:19.670 [WARN] [org.gradle.api.internal.project.ant.AntLoggingAdapter] [ant:echo] updating:D:\dev\util\java7-clientjars\workYYY\lagan\bin\WinIEBrowser.jar
12:06:19.674 [WARN] [org.gradle.api.internal.project.ant.AntLoggingAdapter] [ant:echo] updating:D:\dev\util\java7-clientjars\workYYY\lagan\bin\WinMSWord.jar

12:06:19.690 [INFO] [org.gradle.execution.TaskNameResolvingBuildConfigurationAction] Selected primary task ':resignclientjars'
12:06:19.692 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire exclusive lock on task artifact state cache (D:\dev\util\java7-clientjars\.gradle\1.5\taskArtifacts).
12:06:19.692 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired.
12:06:19.692 [INFO] [org.gradle.BuildLogger] Tasks to be executed: [task ':deletework', task ':getlaganwar', task ':unwar', task ':resignclientjars']

12:06:19.693 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Starting to execute task ':deletework'
12:06:19.693 [DEBUG] [org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter] Determining if task ':deletework' is up-to-date
12:06:19.694 [INFO] [org.gradle.api.internal.changedetection.ShortCircuitTaskArtifactStateRepository] Task ':deletework' has not declared any outputs, assuming that it is out-of-date.
12:06:19.694 [DEBUG] [org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter] task ':deletework' is not up-to-date

12:06:19.695 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter] Executing actions for task ':deletework'.
12:06:19.695 [DEBUG] [org.gradle.api.internal.file.copy.DeleteActionImpl] Deleting D:\dev\util\java7-clientjars\workYYY

12:06:19.934 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':deletework'
12:06:19.934 [LIFECYCLE] [org.gradle.TaskExecutionLogger] :getlaganwar
12:06:19.934 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Starting to execute task ':getlaganwar'
12:06:19.936 [DEBUG] [org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter] Determining if task ':getlaganwar' is up-to-date

12:06:19.942 [INFO] [org.gradle.api.internal.changedetection.DefaultTaskArtifactStateRepository] Executing task ':getlaganwar' due to:
Output file D:\dev\util\java7-clientjars\workYYY for task ':getlaganwar' has changed.
Output file D:\dev\util\java7-clientjars\workYYY\lagan.war has been removed for task ':getlaganwar'.
12:06:19.942 [DEBUG] [org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter] task ':getlaganwar' is not up-to-date

12:06:19.944 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter] Executing actions for task ':getlaganwar'.

12:06:20.564 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':getlaganwar'
12:06:20.565 [LIFECYCLE] [org.gradle.TaskExecutionLogger] :unwar
12:06:20.565 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Starting to execute task ':unwar'
12:06:20.586 [DEBUG] [org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter] Determining if task ':unwar' is up-to-date
12:06:20.588 [DEBUG] [org.gradle.api.internal.changedetection.DefaultFileCacheListener] Can cache files for ZIP 'D:\dev\util\java7-clientjars\workYYY\lagan.war'
12:06:20.588 [DEBUG] [org.gradle.api.internal.changedetection.DefaultFileCacheListener] Can cache files for file 'D:\dev\util\java7-clientjars\workYYY\lagan'
12:06:24.096 [INFO] [org.gradle.api.internal.changedetection.DefaultTaskArtifactStateRepository] Executing task ':unwar' due to:
Output file D:\dev\util\java7-clientjars\workYYY\lagan for task ':unwar' has changed.

12:06:24.097 [DEBUG] [org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter] task ':unwar' is not up-to-date

12:06:24.100 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter] Executing actions for task ':unwar'.

12:06:27.863 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':unwar'
12:06:27.863 [LIFECYCLE] [org.gradle.TaskExecutionLogger] :resignclientjars
12:06:27.864 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Starting to execute task ':resignclientjars'
12:06:27.864 [INFO] [org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter] Skipping task ':resignclientjars' as it has no source files.
12:06:27.864 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':resignclientjars'
12:06:27.864 [LIFECYCLE] [org.gradle.TaskExecutionLogger] :resignclientjars UP-TO-DATE
12:06:27.865 [DEBUG] [org.gradle.execution.taskgraph.DefaultTaskGraphExecuter] Timing: Executing the DAG took 8.173 secs
12:06:27.865 [LIFECYCLE] [org.gradle.BuildResultLogger] 
12:06:27.865 [LIFECYCLE] [org.gradle.BuildResultLogger] BUILD SUCCESSFUL
12:06:27.865 [LIFECYCLE] [org.gradle.BuildResultLogger] 
12:06:27.866 [LIFECYCLE] [org.gradle.BuildResultLogger] Total time: 8.886 secs

共有1个答案

华锦程
2023-03-14

构建脚本的问题不是任务依赖关系,而是resignClientJars的任务定义不正确。它的工作是在配置阶段(即,对于任何构建调用),而不是在执行阶段。正确的任务定义如下所示:

task resignclientjars(dependsOn: unwar) {
    doLast {
       ...
    }
} 

您可以在Gradle用户指南或Gradle论坛中了解配置阶段与执行阶段的关系。

 类似资料:
  • gradle中的“依赖项”是完全不同的,只是一种指定操作顺序的方式,而不是从其他包中导入一些功能吗?是否有任何方法可以只使用/评估某些其他任务的一部分而不是全部(使其更类似于我对依赖项的先入为主的想法)。 让我更加困惑的是在用户指南的核心依赖关系管理一节中讨论的依赖关系的概念。这似乎更符合我对什么是依赖的先入为主的想法。 除非我完全误解了这一切,否则在同一个用户指南中,我们似乎必须区分什么是“依赖

  • 其他地方,如这个其他问题,将有一个依赖于testDebug的JacocoTestReport任务。这很有效。 然而,在我的例子中,除了testDebug之外,我还需要依赖android任务compiledbugsources和compiledbugtestsources。所以我希望下面的方法能奏效 但是,当我使用DepsOn属性或方法时,这些依赖项的顺序不能保证Gradle所述的顺序。所以我想在任

  • 我有什么? 现在我想知道在任务执行之前是否可以使用clean task(常见的构建任务)来清理构建目录。 这背后是有原因的,我想确保每次gradle都应该编译java文件,并且所有.class文件都应该被刷新(这是一些要求) 我试过什么? 我想知道什么? 有没有什么方法可以避免编写包装器任务,并做一些梯度魔术来达到要求?

  • 我有一个3.2.14.Release spring应用程序,并且正在使用java config连接和注入bean。 在我的情况下我需要 设置SSH隧道 创建数据源,使其使用相同的ssh隧道会话 创建使用JDBCTemplate执行SQL查询的查询类 关于如何确保正确的bean初始化顺序,有什么建议吗?

  • 我想从JaCoCo中排除一些类别,但排除似乎不起作用。 例如,我想排除所有以Dao结尾的Java类(例如com.company.emplyedao)。 我已经尝试了以下代码,但当我将其推送到sonar/use JacoTestReport时,它仍然显示出来。 我将它与Android结合使用。发生了什么事?

  • 两个问题: null 更多背景: 现在,我有一个没有插件的构建脚本(换句话说,不是Java)。我需要一个名为的任务,它将运行我的所有测试任务。我有3个这样的任务。将它们称为task1、task2和Task3。 我可以说 最后一个小问题(顺便说一下,我真的很喜欢gradle)是很难搜索这个主题,因为依赖在gradle中意味着两种不同的东西:依赖子样式依赖和库样式依赖。