Maven: como executar um arquivo .java na linha de comando passando argumentos

87

Eu tenho o seguinte problema. Eu gostaria de executar a mvnpartir da linha de comando para um Main.javaarquivo. Main.javaaceita um parâmetro. Como faço isso na linha de comando?

Tentei encontrar um exemplo, mas não tive sucesso. Alguém poderia me ajudar dando um exemplo disso?

Olhei aqui, mas não entendi muito bem o que fazer.

Além disso, como executo esse comando em uma pasta diferente da pasta Main.java?

por exemplo, o Main.javaestá localizado em my/java/program/Main.java. O que devo colocar

mvn exec:java -Dexec.mainClass="what to put here?" -Dexec.args="arg0 arg1 arg2"
phedon rousou
fonte
4
O que exatamente você não entendeu do tutorial vinculado? É muito simples. Adicione à sua pergunta o código que você tentou até agora.
Percepção de
Basicamente, o que estou tentando fazer é chamar uma classe java de outra classe java. Normalmente eu executo essa classe no Eclipse. Estou usando Runtime.getRuntime (). Exec (""); para executar essa classe a partir de outro programa java. Mas Main.class precisa do mvn para ser executado. (Eu editei a pergunta)
phedon rousou

Respostas:

147

Você pode executar: mvn exec:exec -Dexec.args="arg1".

Isso passará o argumento arg1 para o seu programa.

Você deve especificar a classe principal totalmente qualificada, por exemplo, um Main.java que está em um teste de pacote precisaria

mvn exec:java  -Dexec.mainClass=test.Main

Ao usar o -fparâmetro, conforme descrito aqui , você também pode executá-lo de outros diretórios.

mvn exec:java -Dexec.mainClass=test.Main -f folder/pom.xm

Para vários argumentos, simplesmente separe-os com um espaço como faria na linha de comando.

mvn exec:java -Dexec.mainClass=test.Main -Dexec.args="arg1 arg2 arg3"

Para argumentos separados por um space, você pode agrupar usando entre 'argument separated with space' aspas.

mvn exec:java -Dexec.mainClass=test.Main -Dexec.args="'argument separated with space' 'another one'"
Behe
fonte
sim, mas como ele sabe onde o arquivo main.java está localizado?
phedon rousou
e se eu não tiver o pom.xml. Recebo o seguinte erro. Não é possível executar o mojo: java. Requer um projeto com um pom.xml existente, mas o build não está usando um.
phedon rousou
Um projeto maven requer um pom.xml, sem esse arquivo, usar o maven faz pouco sentido. Então, talvez você queira criar um projeto maven primeiro? Então, todas as outras soluções devem funcionar bem.
Behe,
Como eu uso o Eclipse com o plugin maven, pensei que fosse gerado automaticamente, mas aparentemente estava errado. Vou dar uma olhada nisso
phedon rousou
Como passar argumentos que contêm espaços?
Vanuan 01 de
6

Além de executá-lo com mvn exec:java, você também pode executá-lo commvn exec:exec

mvn exec:exec -Dexec.executable="java" -Dexec.args="-classpath %classpath your.package.MainClass"
Benedikt Köppel
fonte
Onde eu colocaria o argumento Xmx nesse caso?
Fabich
1
Tente colocá-lo em -Dexec.args:mvn exec:exec -Dexec.executable="java" -Dexec.args="-Xmx4g -classpath %classpath your.package.MainClass"
Benedikt Köppel
Não vejo onde isso será melhor do que a abordagem direta (IMO) de exec: java
Neowizard
5

Adicionar um script de shell, por exemplo, run.shtorna muito mais fácil:

#!/usr/bin/env bash
export JAVA_PROGRAM_ARGS=`echo "$@"`
mvn exec:java -Dexec.mainClass="test.Main" -Dexec.args="$JAVA_PROGRAM_ARGS"

Então você é capaz de executar:

./run.sh arg1 arg2 arg3
Tommy1005
fonte
Isso funciona muito bem! Você pode explicar por que isso não acontece: -Dexec.args = "$ @"
baumato
1
$@armazena todos os argumentos em uma lista de strings envolta em aspas. Se você quiser usá-lo diretamente, você pode usar $*- todos os argumentos como uma única string. Você tentou isso?
Tommy1005