2011-02-01 25 views
5

Tôi có một số hệ thống cần tải cùng các thuộc tính cho JVM. Tôi có thể sử dụng cờ -D để tải một thuộc tính cùng một lúc, nhưng tôi đang tìm thứ gì đó sẽ tải tất cả các thuộc tính trong toàn bộ tệp cùng một lúc. Ví dụ:Truyền toàn bộ tệp đến các đối số JVM

Tôi chỉ có thể thêm --options-file = blah.properties vào tất cả jvms trên mạng của mình, một lần và từ đó chỉ thay đổi tệp thuộc tính, có thể là một tệp trung tâm duy nhất trên một mạng chia sẻ .

Cảm ơn bạn,

EDIT: Bất kỳ đối số hoặc lệnh nào cũng phải hoạt động trong môi trường cửa sổ. Vì vậy, bất kỳ bash hoặc scripting hacks cụ thể cho unix sẽ không hoạt động.

Trả lời

6

Đó là khoảng cách chúng tôi làm điều đó:

java $(tr '\n' ' ' < options_file) other args...

Đây options_file chứa sẵn sàng -Dsomething hoặc -Xsomething giá trị, mỗi dòng một. Lệnh tr chỉ thay thế mọi dòng mới bằng dấu cách.

+1

Tôi không nghĩ rằng điều này sẽ hoạt động trong các cửa sổ. – doug

+1

@doug: nó sẽ không. Dưới cửa sổ, bạn cần một cái gì đó như 'for/S delim = ...', không thể nhớ, nhưng cửa sổ cung cấp một cách để đọc một dòng tập tin bằng dòng; bạn thêm những dòng này vào một biến môi trường. – 9000

+0

Ok tôi sẽ thử. Cảm ơn, – doug

3

Một số tùy chọn:

  1. Quấn tài sản của bạn trong file .jar của bạn và sau đó nhận được các quá trình của bạn để đọc mà thuộc tính tập tin từ getClass().getResourceAsStream()
  2. Viết một tập tin batch để thực thi các quy trình Java của bạn, và một trong hai danh sách rõ ràng tùy chọn -D hoặc tạo dòng lệnh động.

Tôi giải quyết vấn đề này bình thường bằng cách sử dụng Spring (cũng được sử dụng vì các lý do khác) và PropertyPlaceholderConfigurer. Điều đó cho phép tôi chỉ định một hoặc nhiều vị trí cho các tệp thuộc tính và sửa đổi cấu hình Spring tại chỗ.

+1

getClass(). GetResourceAsStream() được một cái gì đó bạn làm bên trong ứng dụng sau khi nó bắt đầu, phải không? Tôi cần điều này xảy ra trước khi bất kỳ ứng dụng nào được bắt đầu .. – doug

7

Tôi không nghĩ rằng bạn có thể làm điều đó thông qua dòng lệnh (nếu không có hacks bash, có lẽ), nhưng bạn chắc chắn có thể làm điều đó programatically:

Đơn giản chỉ cần thiết lập một tài sản -DmyPropertiesFile=/your/properties/file.properties và sau đó đọc rằng với một trong quá tải Properties.load(). Sau đó, System.setProperties(yourProps) sẽ làm những gì bạn mong đợi.

Tất nhiên, điều này đòi hỏi bạn có thể móc mã này đủ sớm để các thuộc tính của bạn sẽ có sẵn khi cần thiết (Ví dụ, nếu phương pháp main() là của bạn, điều này là hoàn hảo).

+0

Tôi không nghĩ rằng điều này sẽ làm việc vì cả ứng dụng web và ứng dụng log4j cần truy cập vào các biến tương tự ... – doug

0

Nếu bạn sử dụng Ant để lan truyền quá trình Java, câu trả lời của 9000 (cộng với bình luận cửa sổ của anh) sẽ hoạt động và bạn có thể có thỏa thuận phóng với sự khác biệt của hệ điều hành.

Có một sợi StackOverflow here trong đó mô tả làm thế nào để xác định hệ điều hành từ ant

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