Maven: Comment exécuter un fichier .java à partir de la ligne de commande en passant des arguments

87

J'ai le problème suivant. Je voudrais exécuter à mvnpartir de la ligne de commande pour un Main.javafichier. Main.javaaccepte un paramètre. Comment faire cela depuis la ligne de commande?

J'ai essayé de trouver un exemple mais je n'ai pas réussi. Quelqu'un pourrait-il m'aider en m'en donnant un exemple?

J'ai regardé ici mais je n'ai pas bien compris ce que je devais faire.

De plus, comment exécuter cette commande à partir d'un dossier différent du dossier Main.java?

par exemple, le Main.javaest situé dans my/java/program/Main.java. Que dois-je mettre

mvn exec:java -Dexec.mainClass="what to put here?" -Dexec.args="arg0 arg1 arg2"
Phedon Rousou
la source
4
Qu'est-ce que vous n'avez pas compris exactement dans le didacticiel lié? C'est assez simple. Veuillez ajouter à votre question le code que vous avez essayé jusqu'à présent.
Perception le
Fondamentalement, ce que j'essaye de faire est d'appeler une classe java à partir d'une autre classe java. Normalement, j'exécute cette classe depuis Eclipse. J'utilise Runtime.getRuntime (). Exec (""); pour exécuter cette classe à partir d'un autre programme java. Mais Main.class a besoin de mvn pour fonctionner. (J'ai édité la question)
Phedon Rousou

Réponses:

147

Vous pouvez exécuter: mvn exec:exec -Dexec.args="arg1".

Cela passera l'argument arg1 à votre programme.

Vous devez spécifier la classe principale pleinement qualifiée, par exemple, un Main.java qui est dans un test de package aurait besoin

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

En utilisant le -fparamètre, comme décrit ici , vous pouvez également l'exécuter à partir d'autres répertoires.

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

Pour plusieurs arguments, séparez-les simplement par un espace comme vous le feriez sur la ligne de commande.

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

Pour les arguments séparés par un space, vous pouvez regrouper en utilisant entre 'argument separated with space' guillemets.

mvn exec:java -Dexec.mainClass=test.Main -Dexec.args="'argument separated with space' 'another one'"
Behe
la source
oui, mais comment sait-il où se trouve le fichier main.java?
phedon rousou
et si je n'ai pas le pom.xml. J'obtiens l'erreur suivante Impossible d'exécuter mojo: java. Il nécessite un projet avec un pom.xml existant, mais la construction n'en utilise pas.
phedon rousou
Un projet maven nécessite un pom.xml, sans ce fichier, l'utilisation de maven n'a guère de sens. Alors, peut-être voulez-vous d'abord créer un projet maven? Ensuite, toutes les autres solutions devraient fonctionner correctement.
Behe
Parce que j'utilise Eclipse avec le plugin maven, je pensais qu'il était généré automatiquement mais apparemment je me suis trompé. Je vais y jeter un œil
phedon rousou
Comment passer des arguments contenant des espaces?
Vanuan
6

En plus de l'exécuter avec mvn exec:java, vous pouvez également l'exécuter avecmvn exec:exec

mvn exec:exec -Dexec.executable="java" -Dexec.args="-classpath %classpath your.package.MainClass"
Benedikt Köppel
la source
Où placerais-je l'argument Xmx dans ce cas?
Fabich
1
Essayez de le mettre dans -Dexec.args:mvn exec:exec -Dexec.executable="java" -Dexec.args="-Xmx4g -classpath %classpath your.package.MainClass"
Benedikt Köppel
Je ne vois pas où cela sera meilleur que l'approche directe (IMO) de exec: java
Neowizard
5

L'ajout d'un script shell, par exemple, run.shrend les choses beaucoup plus faciles:

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

Ensuite, vous pouvez exécuter:

./run.sh arg1 arg2 arg3
Tommy1005
la source
Cela fonctionne très bien! Pouvez-vous expliquer pourquoi cela ne fonctionne pas: -Dexec.args = "$ @"
baumato
1
$@stocke tous les arguments dans une liste de chaînes entourées de guillemets. Si vous souhaitez l'utiliser directement, vous pouvez utiliser $*- tous les arguments sous la forme d'une seule chaîne. Avez-vous essayé cela?
Tommy1005 le