Maven: Cara menjalankan file .java dari baris perintah lewat argumen

88

Saya memiliki masalah berikut. Saya ingin menjalankan mvndari baris perintah untuk sebuah Main.javafile. Main.javamenerima parameter. Bagaimana cara melakukannya dari baris perintah?

Saya mencoba mencari contoh tetapi saya tidak berhasil. Bisakah seseorang membantu saya dengan memberi saya contoh tentang itu?

Saya melihat ke sini tetapi tidak begitu mengerti apa yang harus saya lakukan.

Juga, bagaimana cara menjalankan perintah itu dari folder yang berbeda dari folder Main.java?

misalnya Main.javaterletak di my/java/program/Main.java. Apa yang harus saya masukkan

mvn exec:java -Dexec.mainClass="what to put here?" -Dexec.args="arg0 arg1 arg2"
phedon rousou
sumber
4
Apa sebenarnya yang tidak Anda pahami dari tutorial yang ditautkan? Ini sangat mudah. Harap tambahkan ke pertanyaan Anda, kode yang telah Anda coba sejauh ini.
Persepsi
Pada dasarnya apa yang saya coba lakukan adalah memanggil kelas java dari kelas java lain. Biasanya saya menjalankan kelas itu dari Eclipse. Saya menggunakan Runtime.getRuntime (). Exec (""); untuk menjalankan kelas itu dari program java lain. Tapi Main.class membutuhkan mvn untuk dijalankan. (Saya mengedit pertanyaan)
phedon rousou

Jawaban:

152

Anda bisa menjalankan: mvn exec:exec -Dexec.args="arg1".

Ini akan meneruskan argumen arg1 ke program Anda.

Anda harus menentukan kelas utama yang sepenuhnya memenuhi syarat, misalnya, yang dibutuhkan Main.java yang ada dalam pengujian paket

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

Dengan menggunakan -fparameter, seperti yang dijelaskan di sini , Anda juga dapat menjalankannya dari direktori lain.

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

Untuk beberapa argumen, cukup pisahkan dengan spasi seperti yang Anda lakukan pada baris perintah.

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

Untuk argumen yang dipisahkan dengan a space, Anda dapat mengelompokkan menggunakan 'argument separated with space' di dalam tanda kutip.

mvn exec:java -Dexec.mainClass=test.Main -Dexec.args="'argument separated with space' 'another one'"
Behe
sumber
1
ya, tapi bagaimana cara mengetahui di mana letak file main.java?
phedon rousou
bagaimana jika saya tidak memiliki pom.xml tersebut. Saya mendapatkan kesalahan berikut Tidak dapat mengeksekusi mojo: java. Ini membutuhkan proyek dengan pom.xml yang sudah ada, tetapi build tidak menggunakannya.
phedon rousou
Proyek maven membutuhkan pom.xml, tanpa file ini, penggunaan maven tidak masuk akal. Jadi, mungkin Anda ingin membuat proyek maven dulu? Maka semua solusi lainnya akan bekerja dengan baik.
Behe
Karena saya menggunakan Eclipse dengan plugin maven saya pikir itu dibuat secara otomatis tetapi ternyata saya salah. Saya akan memeriksanya
phedon rousou
Bagaimana cara menyampaikan argumen yang mengandung spasi?
Vanuan
6

Selain menjalankannya dengan mvn exec:java, Anda juga dapat menjalankannya denganmvn exec:exec

mvn exec:exec -Dexec.executable="java" -Dexec.args="-classpath %classpath your.package.MainClass"
Benedikt Köppel
sumber
Di mana saya akan meletakkan argumen Xmx dalam kasus ini?
Fabich
1
Coba taruh di -Dexec.args:mvn exec:exec -Dexec.executable="java" -Dexec.args="-Xmx4g -classpath %classpath your.package.MainClass"
Benedikt Köppel
Saya tidak melihat di mana ini akan lebih baik daripada (IMO) pendekatan langsung dari exec: java
Neowizard
6

Menambahkan skrip shell misalnya run.shmembuatnya lebih mudah:

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

Kemudian Anda dapat mengeksekusi:

./run.sh arg1 arg2 arg3
Tommy1005
sumber
Ini bekerja dengan baik! Bisakah Anda menjelaskan mengapa ini tidak terjadi: -Dexec.args = "$ @"
baumato
1
$@menyimpan semua argumen dalam daftar string yang dibungkus dengan tanda kutip. Jika Anda ingin menggunakannya secara langsung, Anda dapat menggunakan $*- semua argumen sebagai string tunggal. Apakah kamu sudah mencobanya?
Tommy1005