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

 咔西咔嘻 发布于 2022-12-04 03:05

我有一个使用自定义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.

Gradle任务看起来像:

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

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

6 个回答
  • 很抱歉这么晚回答.

    我找到了@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
    }
    

    并调用如下:

    gradle run -Pmyargs=-d,s
    

    2022-12-11 02:05 回答
  • 更新:
    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'
    }
    

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

    run {
        if (project.hasProperty("appArgs")) {
            args Eval.me(appArgs)
        }
    }
    

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

    2022-12-11 02:07 回答
  • 当然,最重要的是答案可以完成工作,但是我仍然想使用类似

    gradle run path1 path2
    

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

    gralde run --- path1 path2
    

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

    下面的初始化脚本:

      处理命令行并删除---和'---'之后的所有其他参数

      将属性'appArgs'添加到gradle.ext

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

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

    初始化脚本是:

    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
    

    局限性:

      我被迫使用“ ---”而不是“-”

      您必须添加一些全局初始化脚本

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

    gradle -I init.gradle run --- f:/temp/x.xml
    

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

    gradleapp run --- f:/temp/x.xml
    

    2022-12-11 02:08 回答
  • 如果您想一直使用相同的参数集,那么您只需要以下内容.

    run {
        args = ["--myarg1", "--myarg2"]
    }
    

    2022-12-11 02:08 回答
  • 从Gradle 4.9开始,命令行参数可以与--args一起传递.例如,如果要使用命令行参数启动应用程序foo --bar,则可以使用

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

    另请参阅Gradle应用程序插件

    如何升级Gradle包装器

    2022-12-11 02:10 回答
  • 您可以在通过Gradle运行Java类时在Problems传递系统属性和参数时找到解决方案.两者都涉及使用args财产

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

    2022-12-11 02:56 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有