Задача Gradle - передать аргументы в приложение Java

127

У меня есть приложение 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но не получается.

RecuencoJones
источник
Соответствовали ли ответы вашим потребностям? Если да, пометьте одно как решение.
Франсиско Дж. Лопес-Пеллисер,
1
Не совсем ... мы с другом нашли способ сделать это, но у нас еще нет ясности, чтобы опубликовать решение, оба предложенных решения были опробованы, мы поняли, что это нужно сделать, но не сделали Кажется, это действительно работает ...
RecuencoJones
@ 6uitar6reat6od Как вы в итоге решили это? И какая версия Gradle?
xlm 01

Ответы:

80

Начиная с Gradle 4.9, аргументы командной строки можно передавать с помощью --args. Например, если вы хотите запустить приложение с аргументами командной строки foo --bar, вы можете использовать

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

См. Также Плагин приложения Gradle

Как обновить оболочку Gradle

Aming
источник
1
«Ожидается» или опечатка? Должны ли все аргументы передаваться в виде строки, разделенной одинарными кавычками?
RecuencoJones
@RecuencoJones Исправлено согласно docs.gradle.org/current/userguide/…
Дрю Стивенс
1
gradle run --args = 'foo --bar'
Джим Флуд
3
'foo --bar'сбивает с толку, почему бы просто не использовать 'foo bar'.
Эрик Ван
4
@EricWang Это произвольные аргументы командной строки, которые могут понадобиться программе. Приятно показать, что gradle поддерживает любые аргументы, поскольку необработанная строка передается в созданное приложение.
Джоффри
100

Gradle 4.9+

gradle run --args='arg1 arg2'

Предполагается, что у вас build.gradleнастроен плагин Application . Вы 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'
}

Pre-Gradle 4.9

Включите в свой build.gradle:

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

Затем запустить: gradle run -PappArgs="['arg1', 'args2']"

XLM
источник
7
Этот ответ был не только полезным, но и самым простым.
Jossie Calderon
Обновление для вашего обновления: gradle run --args 'arg1 arg2'у меня не сработало. Пришлось сделать:gradle run --args='arg1 arg2'
cmyers 08
@cmyers спасибо, что поймали это! Я обновил свое обновление
xlm
28

Извините, что ответил так поздно.

Я нашел ответ на @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
RecuencoJones
источник
28

Если вы хотите использовать один и тот же набор аргументов все время, вам понадобится следующее.

run {
    args = ["--myarg1", "--myarg2"]
}
Клаудио Фэи
источник
2
Хорошо, для абсолютных новичков вроде меня: чтобы иметь возможность определять задачу запуска, ваш build.gradle должен содержать следующие две строки: apply plugin: 'application' mainClassName = "<полное имя класса, включая путь к пакету>" В противном случае вы не можете определить метод запуска в buuild.gradle
тк ..
1
Я использую id 'application'плагин, и это был тот ответ, который мне был нужен (он работает).
Big Rich
6

Вы можете найти решение в разделе Проблемы с передачей системных свойств и параметров при запуске класса Java через Gradle . Оба предполагают использованиеargs собственности

Также вы должны прочитать разницу между передачей с -Dили с, -Pкоторая объясняется в документации Gradle.

Франсиско Дж. Лопес-Пеллисер
источник
Это тоже видел. Все еще смотрящий. Кажется, что все эти методы хотят редактировать / массировать текущие свойства и передавать их. Командная строка и свойства Java для запуска приложения или службы сродни настройке «Контекст» или «Конфигурация». Было бы лучше иметь плагин, который выполняет такие вещи, как «параметры запуска» в виде параллельных профилей или что-то в этом роде.
будет
5

Конечно, ответы, прежде всего, делают свою работу, но все же я хотел бы использовать что-то вроде

gradle run path1 path2

ну, это невозможно, но что, если мы сможем:

gralde run --- path1 path2

Если вы думаете, что это более элегантно, тогда вы можете это сделать, трюк состоит в том, чтобы обработать командную строку и изменить ее до того, как это сделает gradle, это можно сделать с помощью сценариев инициализации

Скрипт инициализации ниже:

  1. Обработайте командную строку и удалите --- и все остальные аргументы, следующие за '---'
  2. Добавьте свойство 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. Меня заставили использовать '---', а не '-'
  2. Вам нужно добавить глобальный скрипт инициализации

Если вам не нравится глобальный скрипт инициализации, вы можете указать его в командной строке

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

Или лучше добавить псевдоним в свою оболочку:

gradleapp run --- f:/temp/x.xml
Вооз Наум
источник
2
Это прекрасно работает ... если ни один из моих аргументов не начинается с тире. Это делает его бесполезным для обычных синтаксических анализаторов командной строки :(. Как только это происходит, gradle, кажется, рассматривает этот arg как аргумент для gradle (я не думаю, что argsI.remove()это
дает
3

Их нужно передать как argsзадаче, используя свойства проекта, например:

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

добавлен в определение вашей задачи (см. dsl docs )

Затем вы можете запустить его как:

gradle -Ph run
cjstehno
источник