Gradle:在ANT任务上设置JVM选项

Tra*_*kel 5 ant gradle

我正在使用Gradle 2.1并且有一个ANT任务定义如下:

task myTask {
  doFirst {
    ant.taskdef(name:      'mytask',
                classname: 'com.blah.Blah',
                classpath: configurations.gen.asPath
               )
    ant.mytask(foo: 'bar')
  }
}
Run Code Online (Sandbox Code Playgroud)

有一个属性我需要传递给com.blah.Blah作为JVM参数(因为,这个ANT任务的创建者决定系统属性是传递信息的合理方式,而不是像在参数中传递参数值那样理智.我尝试了很多东西,包括:

  • 使用以下命令设置systemProperty所有任务JavaForkOptions:

    tasks.withType(JavaForkOptions) {
      systemProperty 'myproperty', 'blah'
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • -Dmyproperty=blah我调用时传递gradle.
  • 涉及到各种各样的东西ant.systemPropery,ant.options.forkOptions,ant.forkOptions等(我不能真正找到这个随时随地可靠的文档)

我在这里不知所措.这感觉就像我应该可以这样说:

task myTask {
  doFirst {
    ant.taskdef(name:      'mytask',
                classname: 'com.blah.Blah',
                classpath: configurations.gen.asPath
               )
    ant.systemProperty 'myProperty', 'blah'
    ant.mytask(foo: 'bar')
  }
}
Run Code Online (Sandbox Code Playgroud)

......但这显然不起作用.

Ben*_*hko 4

在 Gradle 中,您可以使用 Groovy,因此不会阻止您以编程方式设置系统属性,如下所示:

task myTask {
    doFirst {
        System.setProperty('myProperty', 'blah')
        // Use AntBuilder
        System.clearProperty('myProperty')
    }
}
Run Code Online (Sandbox Code Playgroud)

请记住,Gradle 的 AntBuilder 在与 Gradle 使用的同一进程中执行 Ant 逻辑。因此,设置系统属性将可用于构建中的其他任务。当两个任务使用相同的系统属性(取决于执行顺序)或者并行运行构建时,这可能会产生副作用。

相反,您可能希望更改 Ant 任务以使用 Ant 属性来驱动逻辑(如果这甚至是一个选项)。Ant 属性可以从 Gradle 中设置,如下所示:

task myTask {
    doFirst {
        ant.properties.myProperty = 'blah'
        // Use AntBuilder
    }
}
Run Code Online (Sandbox Code Playgroud)