代码之家  ›  专栏  ›  技术社区  ›  Lucas Basquerotto

仅当专门调用时才运行gradle任务

  •  0
  • Lucas Basquerotto  · 技术社区  · 7 年前

    我有一个 build.gradle 创建java的文件 WAR

    但是在开发过程中,虽然大多数时候我使用普通构建来生成战争文件(或爆发的战争),而且效果很好, 有时我只想执行一个java文件

    我在文件中添加了以下内容:

    task execFile(type: JavaExec) {
        main = mainClass
    
        classpath = sourceSets.main.runtimeClasspath
    
        if (System.getProperty('debug', 'false') == 'true') {
            jvmArgs "-Xdebug", "-agentlib:jdwp=transport=dt_socket,address=8788,server=y,suspend=y"
        }
    
        systemProperties System.getProperties()
    }
    

    gradle execFile -PmainClass=com.mysite.MyClass -Dsomeprop=somevalue
    

    如果我想调试,我会运行:

    gradle execFile -PmainClass=com.mysite.MyClass -Dsomeprop=somevalue -Ddebug=true
    

    通过这种方式,我可以执行(并调试)单个文件,这在开发过程中的某些情况下非常好,但问题是即使我不运行这些代码,也会执行这些代码 execFile

    这在构建和生成WAR文件时会导致错误,所以我要做的是注释这些行,在运行单个文件时取消注释,然后再次注释( )在我运行文件之后,在推git repo之前(否则docker构建过程最终会出错)。

    据我所知,该代码是在 ,并使代码在 处决 对于该任务,我可以将代码包含在 doLast << ):

    Why does gradle run every task in gradle.build

    但在这种情况下,我得到了错误 No main class specified ,可能是由于本讨论中所述的相同原因:

    https://discuss.gradle.org/t/javexec-error-no-main-class-specified/12731

    和args作为任务操作。当任务操作由提供时 JavaExec运行,这是配置这些值的第二个任务操作 配置阶段,而不是在任务操作中删除<&书信电报;。

    如果我删除 方法,但初始问题仍然没有解决。

    所以我想知道的是,是否有一种方法(以及如何)来制造 执行文件 任务仅在显式调用此任务时运行。

    0 回复  |  直到 7 年前
        1
  •  5
  •   Giacomo Venturini    6 年前

    您可以通过包装任务来解决这个问题,方法是在运行时在其内部创建所需的JavaExec任务 doLast { } 关闭。

    对于Groovy DSL:

    task myTask {
        group = 'MyGroup'
        description = 'Runs Hello.java'
        dependsOn 'build'
    
        doLast {
            tasks.create('myTaskExec', JavaExec) {
                main = 'com.example.Hello'
                args = ['foo', 'bar']
                classpath = sourceSets.main.runtimeClasspath
            }.exec()
        }
    }
    

    对于Kotlin DSL:

    tasks.register("myTask") {
        group = "MyGroup"
        description = "Runs Hello.java"
        dependsOn(mutableListOf("build"))
    
        doLast {
            tasks.create<JavaExec>("myTaskExec") {
                main = "com.example.Hello" 
                args = mutableListOf("foo", "bar")
                classpath = sourceSets.main.get().runtimeClasspath
            }.exec()
        }
    }
    

    task execFile {
        dependsOn 'build'
    
        doLast {
            tasks.create('execFileJavaExec', JavaExec) {
                main = mainClass
                classpath = sourceSets.main.runtimeClasspath
    
                if (System.getProperty('debug', 'false') == 'true') {
                    jvmArgs "-Xdebug", "-agentlib:jdwp=transport=dt_socket,address=8788,server=y,suspend=y"
                }
    
                systemProperties System.getProperties()
            }.exec()
        }
    }
    
    推荐文章