Maven: Cách chạy tệp .java từ dòng lệnh truyền đối số


88

Tôi có một vấn đề sau đây. Tôi muốn chạy mvntừ dòng lệnh cho một Main.javatệp. Main.javachấp nhận một tham số. Làm cách nào để làm điều đó từ dòng lệnh?

Tôi đã thử tìm một ví dụ nhưng tôi đã không thành công. Ai đó có thể giúp tôi bằng cách cho tôi một ví dụ về điều đó?

Tôi đã nhìn vào đây nhưng không hiểu mình nên làm gì.

Ngoài ra, làm cách nào để thực thi lệnh đó từ một thư mục khác với thư mục Main.java?

ví dụ như Main.javađược đặt tại my/java/program/Main.java. Tôi nên đặt những gì

mvn exec:java -Dexec.mainClass="what to put here?" -Dexec.args="arg0 arg1 arg2"

4
Bạn không hiểu chính xác điều gì từ hướng dẫn được liên kết? Nó khá thẳng thắn. Vui lòng thêm vào câu hỏi của bạn, mã bạn đã thử cho đến nay.
Nhận thức

Về cơ bản những gì tôi đang cố gắng làm là gọi một lớp java từ một lớp java khác. Thông thường tôi chạy lớp đó từ Eclipse. Tôi đang sử dụng Runtime.getRuntime (). Execute (""); để thực thi lớp đó từ một chương trình java khác. Nhưng Main.class cần mvn để chạy. (Tôi đã chỉnh sửa câu hỏi)
phedon rousou

Câu trả lời:


151

Bạn có thể chạy: mvn exec:exec -Dexec.args="arg1".

Điều này sẽ chuyển đối số arg1 vào chương trình của bạn.

Bạn nên chỉ định lớp chính đủ điều kiện, ví dụ: Main.java nằm trong thử nghiệm gói sẽ cần

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

Bằng cách sử dụng -ftham số, như được mô tả ở đây , bạn cũng có thể chạy nó từ các thư mục khác.

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

Đối với nhiều đối số, chỉ cần tách chúng bằng một khoảng trắng như bạn làm ở dòng lệnh.

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

Đối với các đối số được phân tách bằng a space, bạn có thể nhóm bằng cách sử dụng 'argument separated with space' bên trong dấu ngoặc kép.

mvn exec:java -Dexec.mainClass=test.Main -Dexec.args="'argument separated with space' 'another one'"

1
có, nhưng làm thế nào nó biết được vị trí của tệp main.java?
phedon rousou

điều gì sẽ xảy ra nếu tôi không có pom.xml. Tôi gặp lỗi sau Không thể thực thi mojo: java. Nó yêu cầu một dự án có pom.xml hiện có, nhưng bản dựng không sử dụng một.
phedon rousou

Một dự án maven yêu cầu một tệp pom.xml, nếu không có tệp này, việc sử dụng maven không có ý nghĩa gì. Vì vậy, có thể bạn muốn tạo một dự án maven trước? Sau đó, tất cả các giải pháp khác sẽ hoạt động tốt.
Behe

Bởi vì tôi sử dụng Eclipse với plugin maven, tôi nghĩ rằng nó được tạo tự động nhưng dường như tôi đã nhầm. Tôi sẽ có một cái nhìn vào nó
phedon rousou

Làm thế nào để truyền các đối số có chứa khoảng trắng?
Vanuan

6

Ngoài việc chạy nó với mvn exec:java, bạn cũng có thể chạy nó vớimvn exec:exec

mvn exec:exec -Dexec.executable="java" -Dexec.args="-classpath %classpath your.package.MainClass"

Tôi sẽ đặt đối số Xmx ở đâu trong trường hợp này?
Fabich

1
Cố gắng đưa nó vào -Dexec.args:mvn exec:exec -Dexec.executable="java" -Dexec.args="-Xmx4g -classpath %classpath your.package.MainClass"
Benedikt Koppel

Tôi không thấy nơi đây sẽ là tốt hơn so với (IMO) cách tiếp cận thẳng về phía trước của exec: java
Neowizard

6

Thêm một tập lệnh shell, ví dụ: run.shlàm cho nó dễ dàng hơn nhiều:

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

Sau đó, bạn có thể thực thi:

./run.sh arg1 arg2 arg3

Điều này hoạt động tuyệt vời! Bạn có thể giải thích tại sao điều này không: -Dexec.args = "$ @"
baumato

1
$@lưu trữ tất cả các đối số trong danh sách chuỗi được bao bọc trong dấu ngoặc kép. Nếu bạn muốn sử dụng nó trực tiếp, bạn có thể sử dụng $*- tất cả các đối số dưới dạng một chuỗi duy nhất. Bạn đã thử cái này chưa?
Tommy1005
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.