2011-09-08 48 views
46

Có cách nào dễ dàng hơn để chỉ định nhiều thuộc tính hệ thống trên dòng lệnh cho chương trình Java thay vì có nhiều câu lệnh -D không?Đặt nhiều thuộc tính hệ thống Dòng lệnh Java

Đang cố gắng để tránh điều này:

java -jar -DNAME="myName" -DVERSION="1.0" -DLOCATION="home" program.jar 

tôi nghĩ rằng tôi đã nhìn thấy một ví dụ về một người nào đó sử dụng một -D và một số chuỗi trích dẫn sau đó, nhưng tôi không thể tìm thấy ví dụ một lần nữa.

Trả lời

37

Trả lời là KHÔNG. Bạn có thể đã thấy một ví dụ nơi ai đó sẽ thiết lập một cái gì đó như:

-DArguments=a=1,b=2,c=3,d=4,e=cow

Sau đó, ứng dụng sẽ phân tích giá trị của Arguments chuỗi bất động sản để có được giá trị cá nhân. Trong bạn main bạn có thể nhận các giá trị quan trọng như (Giả định dạng đầu vào được đảm bảo):

String line = System.getProperty("Arguments"); 
if(line != null) { 
    String str[] = line.split(","); 
    for(int i=1;i<str.length;i++){ 
     String arr[] = str[i].split("="); 
     System.out.println("Key = " + arr[0]); 
     System.out.println("Value = " + arr[1]); 
    } 
} 

Ngoài ra, -D nên trước khi lớp học chính hoặc jar file trong dòng lệnh java. Ví dụ: java -DArguments=a=1,b=2,c=3,d=4,e=cow MainClass

10

Không có gì trên số Documentation đề cập đến mọi thứ như thế.

Dưới đây là báo giá:

-Dproperty = giá trị Thiết lập một giá trị tài sản của hệ thống. Nếu giá trị là một chuỗi chứa dấu cách, bạn phải gửi kèm theo chuỗi trong dấu ngoặc kép:

java -Dfoo = "một số chuỗi" SomeClass

+0

Lớp học nào 'SomeClass' đề cập đến? Tôi đang cố gắng thiết lập thuộc tính này để đọc một tệp '.properties', sử dụng Spring, Struts và Tomcat 8.5, đó là phần duy nhất của lệnh vẫn chưa rõ ràng với tôi – Frakcool

+0

@Frakcool' SomeClass' sẽ là lớp với chính phương pháp mà bạn đang cố gắng chạy. Thông thường nó sẽ có một khai báo gói và bạn nên sử dụng tên lớp đầy đủ để chạy nó. – adarshr

+0

Ồ, tôi hiểu rồi, đó là những gì tôi đang nghĩ, tuy nhiên trong một ứng dụng web không có phương pháp 'main', vì vậy, tôi nghĩ nó được thực hiện trong các thuộc tính của tomcat, tôi có đúng không? – Frakcool

13

Thay vì đi qua các tính chất như một cuộc tranh cãi, bạn có thể sử dụng a .properties để lưu trữ chúng.

+5

+1: Bạn cũng có thể tải chúng vào các thuộc tính hệ thống với' System.getProperties(). FileInputStream ("my.properties")) 'Tuy nhiên, có thuộc tính của riêng bạn có thể là một cách tiếp cận tốt hơn. –

0

Nếu các thuộc tính bắt buộc cần phải đặt trong hệ thống thì không có tùy chọn nào hơn -D Nhưng nếu bạn cần các thuộc tính đó trong khi khởi động ứng dụng thì tải thuộc tính thông qua tệp tác vụ là tùy chọn tốt nhất. Nó sẽ không yêu cầu thay đổi xây dựng cho một tài sản duy nhất.

0

Bạn có thể sử dụng biến môi trường JAVA_TOOL_OPTIONS để đặt tùy chọn. Nó làm việc cho tôi với Rasbian. Xem Environment Variables and System Properties có điều này để nói:

Trong nhiều môi trường, dòng lệnh không thể truy cập dễ dàng để khởi động ứng dụng với các tùy chọn dòng lệnh cần thiết. Điều này thường xảy ra với các ứng dụng sử dụng máy ảo nhúng (có nghĩa là họ sử dụng API gọi giao diện bản địa Java (JNI) để khởi động máy ảo ), hoặc nơi khởi động được lồng sâu trong tập lệnh. Trong các môi trường biến môi trường JAVA_TOOL_OPTIONS này có thể hữu ích để tăng thêm dòng lệnh.

Khi biến môi trường này được thiết lập, JNI_CreateJavaVM chức năng (trong Invocation API JNI), hàm JNI_CreateJavaVM thêm giá trị của biến môi trường để các tùy chọn được cung cấp trong lập luận JavaVMInitArgs của nó.

Tuy nhiên, việc sử dụng biến môi trường này có thể bị vô hiệu vì lý do bảo mật.

Trong một số trường hợp, tùy chọn này bị tắt vì lý do bảo mật. Đối với ví dụ , trên hệ điều hành Oracle Solaris, tùy chọn này là bị tắt khi ID người dùng hoặc nhóm có hiệu lực khác với ID thực.

Xem ví dụ này cho thấy sự khác biệt giữa chỉ định trên dòng lệnh so với sử dụng biến môi trường JAVA_TOOL_OPTIONS.

screenshot showing use of JAVA_TOOL_OPTIONS environment variable

Các vấn đề liên quan