【问题标题】:How do I execute ant.java properly from gradle?如何从 gradle 正确执行 ant.java?
【发布时间】:2011-10-22 21:03:11
【问题描述】:

我正在尝试调用一个 jar,但是当我在没有 args 的情况下运行命令时看不到任何输出,当我 do 使用 args 运行时,我收到以下错误:

[ant:java] The args attribute is deprecated. Please use nested arg elements.
[ant:java] Java Result: 1

如何调用 ant.java 以使我看到输出并可以传递参数?

task compressJs(){
  ant.java(jar:"lib/yuicompressor-2.4.6.jar",fork:true,args:['js/file.js', '-o', 'build/js/file.js'])
}

【问题讨论】:

    标签: java ant groovy jar gradle


    【解决方案1】:

    除了 Chris Dail 的回答之外,您还可以使用类似的东西

    ant.java(jar:"lib/yuicompressor-2.4.6.jar",fork:true) {
        arg(line: "js/file.js -o build/js/file.js")
    }
    

    这允许在一行中声明所有参数,非常类似于 ANT 中的用法。

    【讨论】:

      【解决方案2】:

      正如我之前所说,最好使用JavaExec 任务。要执行 Jar,您可以:

      task exec(type: JavaExec) { 
          main = "-jar" 
          args relativePath("lib/yuicompressor-2.4.6.jar") 
          args ... // add any other args as necessary 
      }
      

      http://issues.gradle.org/browse/GRADLE-1274 中的 cmets 也解释了如何从ant.java 捕获输出,但使用JavaExec 是更好的解决方案。

      【讨论】:

      • 这个可以分叉吗?
      • 糟糕,我的意思是 spawn(如 ant.java 的 spawn),而不是 fork。
      • 有什么区别?你想异步运行它吗? JavaExec 目前无法做到这一点。
      • 这不起作用。它不调用 -jar 命令,也没有运行。
      【解决方案3】:

      要获得输出,请在 gradle 上设置 --info 标志或在 ant.java 上设置 outputproperty:

      task compressJs(){
        ant.java(outputproperty: 'cmdOut', jar:"lib/yuicompressor-2.4.6.jar",fork:true,args:['js/file.js', '-o', 'build/js/file.js'])
        println(ant.project.properties.cmdOut)
      }
      

      【讨论】:

      • args 是错误的,应该像下面的 Chris Dail 那样指定。你期望得到什么输出;在命令行上运行时你明白了吗?
      • 当然我使用了正确的参数结构。 cmdOut 属性本身对输出没有影响。当您直接运行 jar 时,它会将输出放入 System.out。通过 gradle 和 ant.java 调用时,此输出无处可去。
      【解决方案4】:

      Ant任务需要在执行阶段调用,而不是配置阶段:

      task compressJs() << { // note the <<
        ant.java(...)
      }
      

      您也可以使用 Gradle 的 JavaExec 任务。请参阅文档。

      【讨论】:

      • 这似乎并没有改变任何东西,无论它在语义上是否正确。
      • 没有回答你的问题,但你为什么不使用 Gradle 的 JavaExec?
      • 我没有看到一种简单的方法来执行带有 args 的 jar 并获取输出。该任务的文档非常原始。
      • 你看过here吗?目前还没有对执行 Jar 的特殊支持;你只需要执行主类。
      • 这不是应用程序被调用的方式。无论如何,我不能依赖任何给定的主类。
      【解决方案5】:

      你的参数应该这样指定:

      ant.java(jar:"lib/yuicompressor-2.4.6.jar",fork:true) {
          arg(value: "js/file.js")
          arg(value: "-o")
          arg(value: "build/js/file.js")
      }
      

      除了使用 Groovy 样式标记生成器而不是 XML 之外,它与您对 ant 所做的几乎相同。

      默认情况下,您的输出将显示在屏幕上。如果要重定向它,请设置“输出”属性。

      【讨论】:

      • 输出仍在被压缩。
      • 如何发送参数参数?前任。 command --key value
      • 为什么会得到输出:Java result 1?这是一个错误吗?
      • 你可以得到这样的输出:ant.java(...., outputproperty: 'op') { // stuff } println ant.properties.op
      • 如何给它classpath
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 2019-09-17
      相关资源
      最近更新 更多