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

mcdcgff0  于 2023-10-19  发布在  Java
关注(0)|答案(8)|浏览(124)

我有一个运行自定义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,它不工作。

koaltpgm

koaltpgm1#

Gradle 4.9+

gradle run --args='arg1 arg2'

这假设您的build.gradle配置了Application plugin。你的build.gradle应该看起来像这样:

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

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

预科4.9

build.gradle中包含以下内容:

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

然后运行:gradle run -PappArgs="['arg1', 'args2']"

lzfw57am

lzfw57am2#

从Gradle 4.9开始,命令行参数可以通过--args传递。例如,如果要使用命令行参数foo --bar启动应用程序,可以使用
gradle run --args='foo --bar'
See Also Gradle Application Plugin
如何升级Gradle Package 器

relj7zay

relj7zay3#

如果你想一直使用同一组参数,下面就是你所需要的。

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

gkl3eglg4#

抱歉这么晚才接电话。
我想了一个类似于@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
ttcibm8c

ttcibm8c5#

您可以在Problems passing system properties and parameters when running Java class via Gradle中找到解决方案。两者都涉及args属性的使用
此外,您应该阅读Gradle文档中解释的使用-D-P传递之间的差异

ldioqlga

ldioqlga6#

当然,以上的答案都可以,但我仍然想使用类似于

gradle run path1 path2

这是不可能的,但如果我们可以:

gralde run --- path1 path2

如果你认为它更优雅,那么你可以这样做,诀窍是在gradle做之前处理命令行并修改它,这可以通过使用init脚本来完成
下面的init脚本:
1.处理命令行并删除-和“-”后面的所有其他参数
1.将属性'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

局限性:
1.我被迫用“-”而不是“-”
1.您必须添加一些全局初始化脚本
如果你不喜欢全局初始化脚本,可以在命令行中指定

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

或者更好地为shell添加一个别名:

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

zbwhf8kr7#

您需要使用项目属性将它们作为args传递给任务,例如:

args = [project.property('h')]

添加到您的任务定义中(请参阅配置文件)
然后你可以运行它:

gradle -Ph run
dldeef67

dldeef678#

使用KotlinDSL:

plugins {
    java
    application
}

application {
    mainClass = "io.fouad.AppLauncher"
    applicationDefaultJvmArgs = listOf("-Dsome.system.properties=123")
}

tasks.withType(JavaExec::class) {
    args = listOf("abc", "def")
}

相关问题