Gradle任务 - 将参数传递给Java应用程序

Rec*_*nes 105 java arguments gradle

我有一个使用自定义gradle任务运行的Java应用程序,并且应用程序在被调用时需要一些参数.这些是:

programName ( string | -f filename | -d key | -h)
Options:
    string         Message to be used.
    -d key         Use default messages, key must be s[hort], m[edium] or l[ong].
    -f filename    Use specified file as input.
    -h             Help dialog.
Run Code Online (Sandbox Code Playgroud)

Gradle任务看起来像:

task run (type: JavaExec){
    description = "Secure algorythm testing"
    main = 'main.Test'
    classpath = sourceSets.main.runtimeClasspath
}
Run Code Online (Sandbox Code Playgroud)

我试过跑gradle run -h,但是不起作用.

xlm*_*xlm 92

更新:
Gradle 4.9为传递命令行参数提供了更好的支持,例如:

plugins {
  // Implicitly applies Java plugin
  id: 'application'
}

application {
  // URI of your main class/application's entry point (required)
  mainClassName = 'org.gradle.sample.Main'
}
Run Code Online (Sandbox Code Playgroud)

Pre-Gradle 4.9,将以下内容添加到build.gradle:

run {
    if (project.hasProperty("appArgs")) {
        args Eval.me(appArgs)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后运行: gradle run --args='arg1 arg2'

  • 这个答案不仅有用,而且最简单. (7认同)

AMi*_*ing 57

从Gradle 4.9开始,命令行参数可以与--args一起传递.例如,如果要使用命令行参数启动应用程序foo --bar,则可以使用

gradle run --args ='foo --bar'

另请参阅Gradle应用程序插件

如何升级Gradle包装器

  • @EricWang这些是程序可能需要的任意命令行参数.很高兴显示gradle支持任何类型的参数,因为原始字符串被传递给构建的应用程序. (3认同)
  • ''foo --bar''令人困惑,为什么不只是使用''foo bar'`. (2认同)

Rec*_*nes 27

很抱歉这么晚回答.

我找到了@xlm的答案:

task run (type: JavaExec, dependsOn: classes){
    if(project.hasProperty('myargs')){
        args(myargs.split(','))
    }
    description = "Secure algorythm testing"
    main = "main.Test"
    classpath = sourceSets.main.runtimeClasspath
}
Run Code Online (Sandbox Code Playgroud)

并调用如下:

gradle run -Pmyargs=-d,s
Run Code Online (Sandbox Code Playgroud)


小智 22

如果您想一直使用相同的参数集,那么您只需要以下内容.

run {
    args = ["--myarg1", "--myarg2"]
}
Run Code Online (Sandbox Code Playgroud)

  • 好的,对于像我这样的绝对新手而言:为了能够定义运行任务,您的build.gradle应该包含以下两行:apply plugin:'application'mainClassName =“ <包含包路径的完整类名>”否则,您将无法定义buuild.gradle中的run方法 (2认同)

小智 7

您可以在通过Gradle运行Java类时Problems传递系统属性和参数时找到解决方案.两者都涉及使用args财产

您还应该阅读Gradle文档中解释的传递-D或使用-P它之间的区别


小智 5

当然,最重要的是答案可以完成工作,但是我仍然想使用类似

gradle run path1 path2
Run Code Online (Sandbox Code Playgroud)

好吧,这不可能完成,但是如果可以的话:

gralde run --- path1 path2
Run Code Online (Sandbox Code Playgroud)

如果您认为它更优雅,则可以这样做,诀窍是在gradle之前处理命令行并对其进行修改,这可以通过使用init脚本来完成

下面的初始化脚本:

  1. 处理命令行并删除---和'---'之后的所有其他参数
  2. 将属性'appArgs'添加到gradle.ext

因此,在您的运行任务(或JavaExec,Exec)中,您可以:

if (project.gradle.hasProperty("appArgs")) {
                List<String> appArgs = project.gradle.appArgs;

                args appArgs

 }
Run Code Online (Sandbox Code Playgroud)

初始化脚本是:

import org.gradle.api.invocation.Gradle

Gradle aGradle = gradle

StartParameter startParameter = aGradle.startParameter

List tasks = startParameter.getTaskRequests();

List<String> appArgs = new ArrayList<>()

tasks.forEach {
   List<String> args = it.getArgs();


   Iterator<String> argsI = args.iterator();

   while (argsI.hasNext()) {

      String arg = argsI.next();

      // remove '---' and all that follow
      if (arg == "---") {
         argsI.remove();

         while (argsI.hasNext()) {

            arg = argsI.next();

            // and add it to appArgs
            appArgs.add(arg);

            argsI.remove();

        }
    }
}

}


   aGradle.ext.appArgs = appArgs
Run Code Online (Sandbox Code Playgroud)

局限性:

  1. 我被迫使用“ ---”而不是“-”
  2. 您必须添加一些全局初始化脚本

如果您不喜欢全局初始化脚本,则可以在命令行中指定它

gradle -I init.gradle run --- f:/temp/x.xml
Run Code Online (Sandbox Code Playgroud)

或更好地为您的外壳添加别名:

gradleapp run --- f:/temp/x.xml
Run Code Online (Sandbox Code Playgroud)

  • 如果我的论点都没有以破折号开头,这将非常有用。这使得它对于常见的[命令行解析器](https://commons.apache.org/proper/commons-cli/usage.html)毫无用处:(。一旦发生这种情况,gradle似乎会将arg作为参数摇晃(我认为“ argsI.remove()”没有达到预期的效果)。 (2认同)