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"

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'"

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"

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.