Ответ 1
Начиная с Gradle 4.9, аргументы командной строки можно передавать с помощью --args. Например, если вы хотите запустить приложение с аргументами командной строки foo --bar
, вы можете использовать
Gradle Run --args = 'foo --bar'
У меня есть приложение Java, которое работает с пользовательской задачей gradle, и при вызове приложения требуются некоторые аргументы. Это:
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
, и он не работает.
Начиная с Gradle 4.9, аргументы командной строки можно передавать с помощью --args. Например, если вы хотите запустить приложение с аргументами командной строки foo --bar
, вы можете использовать
Gradle Run --args = 'foo --bar'
Включите в свой build.gradle
следующее:
plugins {
// Implicitly applies Java plugin
id: 'application'
}
application {
// URI of your main class/application entry point (required)
mainClassName = 'org.gradle.sample.Main'
}
Затем запустить: gradle run --args='arg1 arg2'
Pre-Gradle 4.9
Включите в свой build.gradle
следующее:
run {
if (project.hasProperty("appArgs")) {
args Eval.me(appArgs)
}
}
Затем запустить: gradle run -PappArgs="['arg1', 'args2']"
Извините за ответ так поздно.
Я решил ответить на @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
Если вы хотите использовать один и тот же набор аргументов все время, вам понадобится следующее.
run {
args = ["--myarg1", "--myarg2"]
}
Вы можете найти решение в Проблемы с передачей свойств и параметров системы при запуске Java-класса через Gradle. Оба связаны с использованием свойства args
Также вы должны прочитать разницу между передачей с помощью -D
или с -P
, которая объясняется в документации Gradle
Конечно ответы прежде всего делают работу, но все же я хотел бы использовать что-то вроде
gradle run path1 path2
ну, это не может быть сделано, но что, если мы можем:
gralde run --- path1 path2
Если вы думаете, что это более элегантно, тогда вы можете сделать это, хитрость заключается в том, чтобы обработать командную строку и изменить ее до того, как это сделает gradle, это можно сделать с помощью сценариев инициализации
Сценарий инициализации ниже:
Таким образом, в вашей задаче запуска (или 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
Вам нужно передать их как args
в задачу с использованием свойств проекта, например:
args = [project.property('h')]
добавлен в определение задачи (см. dsl docs)
Затем вы можете запустить его как:
gradle -Ph run