Tarefa Gradle - passe argumentos para o aplicativo Java

127

Eu tenho um aplicativo Java que é executado com uma tarefa de classificação personalizada e o aplicativo requer alguns argumentos ao ser chamado. Esses são:

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.

A tarefa Gradle se parece com:

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

Eu tentei correr gradle run -he não funciona.

RecuencoJones
fonte
As respostas atenderam às suas necessidades? Nesse caso, você deve marcar um como solução.
Francisco J. Lopez-Pellicer
1
Na verdade, não ... um amigo e eu descobrimos uma maneira de fazê-lo, mas ainda não temos uma solução clara para publicar uma solução, ambas as soluções propostas foram tentadas, entendemos o que deveria ser feito, mas não ' realmente parece funcionar ...
RecuencoJones
@ 6uitar6reat6od Como você resolveu isso no final? Também qual versão do gradle?
Xlm

Respostas:

80

Desde o Gradle 4.9, os argumentos da linha de comando podem ser passados ​​com --args. Por exemplo, se você deseja iniciar o aplicativo com argumentos de linha de comando foo --bar, pode usar

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

Veja também Gradle Application Plugin

Como atualizar o invólucro Gradle

AMing
fonte
1
O 'esperado ou um erro de digitação? Todos os argumentos devem ser passados ​​como uma cadeia delimitada por aspas simples?
RecuencoJones
@RecuencoJones Corrigido por docs.gradle.org/current/userguide/…
Drew Stephens
1
--args run Gradle = 'foo --bar'
Jim Flood
3
'foo --bar'é confuso, por que não usar 'foo bar'?
Eric Wang
4
@EricWang Estes são argumentos arbitrários da linha de comando que um programa pode precisar. É bom mostrar que o gradle suporta qualquer tipo de argumento, já que a cadeia bruta é passada para o aplicativo criado.
Joffrey
100

Gradle 4.9+

gradle run --args='arg1 arg2'

Isso pressupõe que você build.gradleesteja configurado com o plug-in de aplicativo . Você build.gradledeve se parecer com isso:

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

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

Pré-graduação 4.9

Inclua o seguinte no seu build.gradle:

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

Então, para executar: gradle run -PappArgs="['arg1', 'args2']"

xlm
fonte
7
Essa resposta não foi apenas útil, mas a mais simples.
Jossie Calderon
Atualização para sua atualização: gradle run --args 'arg1 arg2'não funcionou para mim. Eu tive que fazer:gradle run --args='arg1 arg2'
cmyers
@ cmyers obrigado por pegar isso! Atualizei minha atualização
xlm
28

Desculpe por responder tão tarde.

Imaginei uma resposta parecida com a do @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
}

E invoque como:

gradle run -Pmyargs=-d,s
RecuencoJones
fonte
28

Se você deseja usar o mesmo conjunto de argumentos o tempo todo, basta fazer o seguinte.

run {
    args = ["--myarg1", "--myarg2"]
}
Claudio Fahey
fonte
2
Ok, para iniciantes absolutos como eu: para poder definir a tarefa de execução, seu build.gradle deve conter as duas linhas a seguir: apply plugin: 'application' mainClassName = "<nome completo da classe, incluindo o caminho do pacote>" Caso contrário, você não poderá definir o método de execução na buuild.gradle
mk ..
1
Estou usando o id 'application'plugin e esta foi a resposta que eu precisava (funciona).
Big Rich
6

Você pode encontrar a solução em Problemas ao passar propriedades e parâmetros do sistema ao executar a classe Java via Gradle . Ambos envolvem o uso doargs propriedade

Você também deve ler a diferença entre passar com -Dou com -Pisso é explicada na documentação do Gradle

Francisco J. Lopez-Pellicer
fonte
Vi isso também. Ainda olhando. Todos esses métodos parecem querer editar / massagear as propriedades atuais e repassá-las. A linha de comando e as propriedades Java para executar um aplicativo ou serviço são semelhantes às configurações de "Contexto" ou "Configuração". Seria melhor ter um plug-in que faça coisas como "executar parâmetros" como perfis lado a lado ou algo assim.
será
5

Claro que as respostas acima de tudo fazem o trabalho, mas ainda assim eu gostaria de usar algo como

gradle run path1 path2

bem, isso não pode ser feito, mas e se pudermos:

gralde run --- path1 path2

Se você acha que é mais elegante, pode fazê-lo, o truque é processar a linha de comando e modificá-la antes do gradle, isso pode ser feito usando scripts init

O script init abaixo:

  1. Processe a linha de comando e remova --- e todos os outros argumentos após '---'
  2. Adicione a propriedade 'appArgs' a gradle.ext

Portanto, na sua tarefa de execução (ou JavaExec, Exec), você pode:

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

                args appArgs

 }

O script 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

Limitações:

  1. Fui forçado a usar '---' e não '-'
  2. Você precisa adicionar algum script init global

Se você não gosta do script init global, pode especificá-lo na linha de comando

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

Ou melhor, adicione um alias ao seu shell:

gradleapp run --- f:/temp/x.xml
Boaz Nahum
fonte
2
Isso funciona muito bem ... se nenhum dos meus argumentos começar com um traço. Isso o torna inútil para os analisadores de linha de comando comuns :(. Assim que isso acontece, gradle parece tratar esse argumento como um argumento para classificar (não acho argsI.remove()que o efeito tenha o efeito desejado). Sugestões?
Krease
3

Você precisa passá-los argspara a tarefa usando propriedades do projeto, algo como:

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

adicionado à sua definição de tarefa (consulte os documentos dsl )

Então você pode executá-lo como:

gradle -Ph run
cjstehno
fonte