Завдання 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і це не працює.


Чи відповідали відповіді вашим потребам? Якщо так, то слід позначити його як рішення.
Франсіско Дж. Лопес-Пелліцер

1
Насправді ... ми з другом знайшли спосіб це зробити, але у нас поки це не зрозуміло, щоб опублікувати рішення, обидва запропоновані рішення були випробувані, ми зрозуміли, що це робити, але хіба ' t, справді, здається, працює ...
RecuencoJones

@ 6uitar6reat6od Як ви вирішили це врешті? Також яка версія gradle?
xlm

Відповіді:


80

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

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

Див. Також Плагін програми Gradle

Як оновити обгортку Gradle


1
Це "очікуване чи помилка друку"? Чи всі аргументи повинні бути передані у вигляді рядка, обмеженого одинарними лапками?
RecuencoJones

@RecuencoJones Виправлено на docs.gradle.org/current/userguide/…
Дрю Стівенс

1
gradle run --args = 'foo --bar'
Jim Flood

3
'foo --bar'бентежить, чому не просто використовувати 'foo bar'.
Ерік Ван

4
@EricWang Це довільні аргументи командного рядка, яким може знадобитися програма. Приємно показати, що gradle підтримує будь-який аргумент, оскільки необроблена рядок передається вбудованому додатку.
Джоффрі

100

Градле 4.9+

gradle run --args='arg1 arg2'

Це передбачає, що ваш build.gradleналаштований плагіном програми . Ви 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'
}

Попереднє Gradle 4.9

Включіть у своє build.gradle:

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

Потім запустити: gradle run -PappArgs="['arg1', 'args2']"


7
Ця відповідь була не лише корисною, але й найпростішою.
Джоссі Кальдерон

Оновлення для вашого оновлення: gradle run --args 'arg1 arg2'не працювало для мене. Мені довелося зробити:gradle run --args='arg1 arg2'
cmyers

@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

28

Якщо ви хочете постійно використовувати один і той же набір аргументів, далі все, що вам потрібно.

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

2
Добре, для абсолютних початківців, як я: щоб мати змогу визначити завдання запуску, ваш build.gradle повинен містити два рядки: застосувати плагін: 'application' mainClassName = "<повне ім'я класу, включаючи шлях пакета>" В іншому випадку ви не можете визначити метод запуску в buuild.gradle
mk ..

1
Я використовую id 'application'плагін, і це була відповідь, яка мені була потрібна (працює).
Великий Річ

6

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

Також слід ознайомитися з різницею між проходженням -Dабо з тим, -Pщо пояснено в документації на Gradle


Побачив і це. Ще шукаю. Усі ці методи, схоже, хочуть редагувати / масажувати поточні властивості та передавати їх. Властивості командного рядка та Java для запуску програми чи послуги схожі на налаштування "Контекст" або "Конфігурація". Було б краще мати плагін, який виконує такі дії, як "виконання параметрів" як профілі поруч або щось подібне.
буде

5

Звичайно, відповіді, перш за все, виконують роботу, але все ж я хотів би використати щось на кшталт

gradle run path1 path2

ну цього не можна зробити, але що робити, якщо ми можемо:

gralde run --- path1 path2

Якщо ви вважаєте, що це більш елегантно, то ви можете це зробити, трюк - це обробити командний рядок і змінити його до того, як зробить gradle, це можна зробити за допомогою скриптів init

Сценарій init нижче:

  1. Обробіть командний рядок та видаліть --- та всі інші аргументи, що відповідають "---"
  2. Додайте властивість "appArgs" до gradle.ext

Отже, у виконанні завдання запуску (або JavaExec, Exec) ви можете:

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

                args appArgs

 }

Сценарій init:

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. Ви повинні додати деякий глобальний сценарій init

Якщо вам не подобається глобальний скрипт init, ви можете вказати його в командному рядку

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

Або краще додати псевдонім до оболонки:

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

2
Це чудово працює ... якщо жоден з моїх аргументів не починається з тире. Це робить його марним для загальних аналізаторів командного рядка :(. Як тільки це станеться, gradle, здається, трактує цей аргумент як аргумент для gradle (я не думаю, що той argsI.remove()має бажаний ефект). Пропозиції?
Krease

3

Вам потрібно передати їх argsзавданням, використовуючи властивості проекту, наприклад:

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

додано до визначення завдання (див. документи DSL )

Тоді ви можете запустити його як:

gradle -Ph run
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.