Maven: как запустить файл .java из командной строки, передав аргументы

88

У меня следующая проблема. Я хочу запустить файл mvnиз командной строки Main.java. Main.javaпринимает параметр. Как мне это сделать из командной строки?

Я попытался найти пример, но мне это не удалось. Может ли кто-нибудь помочь мне, приведя мне пример этого?

Я посмотрел сюда, но не совсем понял, что мне делать.

Кроме того, как мне выполнить эту команду из папки, отличной от папки Main.java?

например, Main.javaнаходится в my/java/program/Main.java. Что я должен положить

mvn exec:java -Dexec.mainClass="what to put here?" -Dexec.args="arg0 arg1 arg2"
Phedon Rousou
источник
4
Что именно вы не поняли из связанного руководства? Это довольно просто. Пожалуйста, добавьте к своему вопросу код, который вы уже пробовали.
Perception
В основном я пытаюсь вызвать класс java из другого класса java. Обычно я запускаю этот класс из Eclipse. Я использую Runtime.getRuntime (). Exec (""); для выполнения этого класса из другой программы Java. Но для Main.class требуется mvn. (Я отредактировал вопрос)
phedon rousou

Ответы:

151

Вы можете запустить: mvn exec:exec -Dexec.args="arg1".

Это передаст аргумент arg1 вашей программе.

Вы должны указать полный класс основного, например, Main.java, который находится в тесте пакета, потребует

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

Используя -fпараметр, описанный здесь , вы также можете запускать его из других каталогов.

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

Для нескольких аргументов просто разделите их пробелом, как в командной строке.

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

Аргументы, разделенные знаком space, можно сгруппировать, используя 'argument separated with space' кавычки.

mvn exec:java -Dexec.mainClass=test.Main -Dexec.args="'argument separated with space' 'another one'"
Бехе
источник
1
да, но как он узнает, где находится файл main.java?
phedon rousou
что делать, если у меня нет pom.xml. Я получаю следующую ошибку: Невозможно выполнить mojo: java. Требуется проект с существующим pom.xml, но сборка его не использует.
phedon rousou
Проекту maven требуется pom.xml, без этого файла использование maven не имеет смысла. Итак, может быть, вы сначала хотите создать проект maven? Тогда все остальные решения должны работать нормально.
Behe
Поскольку я использую Eclipse с плагином maven, я думал, что он сгенерирован автоматически, но, видимо, я ошибался. Я посмотрю на это
phedon rousou
Как передавать аргументы, содержащие пробелы?
Vanuan 01
6

Помимо запуска с помощью mvn exec:java, вы также можете запустить его с помощьюmvn exec:exec

mvn exec:exec -Dexec.executable="java" -Dexec.args="-classpath %classpath your.package.MainClass"
Бенедикт Кёппель
источник
Куда бы я поместил аргумент Xmx в этом случае?
Fabich 08
1
Попробуйте -Dexec.argsmvn exec:exec -Dexec.executable="java" -Dexec.args="-Xmx4g -classpath %classpath your.package.MainClass"
Бенедикт Кёппель
Я не вижу, где это будет лучше, чем (IMO) прямой подход exec: java
Neowizard
6

Например, добавление сценария оболочки run.shделает его намного проще:

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

Тогда вы можете выполнить:

./run.sh arg1 arg2 arg3
Tommy1005
источник
Это прекрасно работает! Можете ли вы объяснить, почему это не так: -Dexec.args = "$ @"
baumato
1
$@сохраняет все аргументы в списке строк, заключенных в кавычки. Если вы хотите использовать его напрямую, вы можете использовать $*- все аргументы как одну строку. Вы пробовали это?
Tommy1005,