2011-07-18 48 views
17

Có thể khởi tạo thuộc tính hệ thống Java bằng cách sử dụng một số loại tệp cấu hình nào đó không? Đặt thuộc tính hệ thống Java bằng tệp cấu hình

(ví dụ: bạn có thể đặt java.library.path sử dụng một tập tin bên trong jar của bạn)

EDIT: Làm rõ: Tôi yêu cầu cụ thể về khởi các thuộc tính hệ thống để một giá trị trong một tệp, không đặt chúng sau này từ bên trong máy ảo. Có, bạn có thể thay đổi thuộc tính hệ thống thành bất kỳ thứ gì bạn muốn rất dễ dàng sau khi máy khởi động, nhưng các lớp hệ thống Java sẽ không sử dụng các giá trị mới.

Thực tế, điều này có nghĩa là System.setProperty và System.setProperties vô dụng khi tải thư viện gốc, vì JNI sẽ luôn sử dụng giá trị gốc của java.library.path để tải thư viện. Tôi đang cố gắng tìm ra nếu có một thay thế sạch hơn chỉ cần đặt -Djava.library.path = bất cứ điều gì trong bắt đầu lên kịch bản ở khắp mọi nơi.

+0

Bạn cần triển khai mẫu quan sát.Khi thay đổi tệp thuộc tính, bạn có thể có nút trên màn hình quản trị để hệ thống đọc giá trị mới hoặc tiếp tục kiểm tra thay đổi ngày trên tệp thuộc tính. – Shahzeb

+0

Chắc chắn có thể tải các thư viện gốc từ bất kỳ nơi nào bạn muốn cho các lớp của riêng bạn: OSGi đưa ra một phương thức để thực hiện điều đó cho các gói thông qua tiêu đề tệp kê khai Bundle-NativeCode. –

Trả lời

16

Có một cách để thiết lập java.library.path programatically, xem this.

Mã này là một hack để thiết lập các lĩnh vực sys_path trên ClassLoader,

System.setProperty("java.library.path", "/path/to/libs"); 

Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths"); 
fieldSysPath.setAccessible(true); 
fieldSysPath.set(null, null); 
1

Bạn không thể khởi tạo chúng theo như tôi biết, nhưng bạn chắc chắn có thể ghi đè giá trị của chúng theo bất kỳ thứ gì bạn muốn, sử dụng bất kỳ nguồn nào bạn muốn.

10

Nó sẽ là khá đơn giản để làm cho mình:

public static void main(String[] args) { 
    Properties p = new Properties(); 
    p.load(...); // Load the properties from a file in your jar 
    for (String name : p.stringPropertyNames()) { 
     String value = p.getProperty(name); 
     System.setProperty(name, value); 
    } 
} 
+0

Làm rõ OP: "Tôi yêu cầu cụ thể về việc khởi tạo thuộc tính hệ thống thành một giá trị trong một tệp, chứ không phải đặt chúng sau này từ bên trong máy ảo". – zacheusz

2

Bạn có thể phân tích tập tin thuộc tính với mã bổ sung (một thể hiện của JVM), chuyển hướng sản lượng của nó để var và sử dụng biến này như tham số đến lời gọi java của bạn. Ví dụ:

public class SystemPropertyLoader { 
public static void main(String[] args) throws Exception { 
    String file = args[0];//TODO check args 
    Properties properties = new Properties(); 
    InputStream is = new FileInputStream(file); 
    properties.load(is); 
    is.close(); 
    StringBuilder builder = new StringBuilder(); 
    for (Entry e : properties.entrySet()){ 
     builder.append("-D"); 
     builder.append(e.getKey()); 
     builder.append('='); 
     builder.append(e.getValue()); 
     builder.append(' '); 
    } 
    System.out.println(builder.toString()); 
} 
} 

#!/bin/ksh 
properties_variable=$(java SystemPropertyLoader input.properties) 
+4

Điều này thực sự xấu xí. Tôi gần như downvoted nó. –

2

Tôi nghĩ lý do tại sao System.setProperty(key,value) là vô ích cho java.library.path trong chương trình của bạn là ứng dụng của bạn bắt đầu, bạn cần phải cài đặt nó trước khi chương trình bạn đang chạy.

Kiểm tra thư viện gốc của bạn, nếu thư viện có bất kỳ phụ thuộc nào không được bao gồm trong java.library.path, System.load sẽ không thành công, như thể System.setProperty(key, value) không hoạt động như mong đợi.

0

Sử dụng biến môi trường JAVA_TOOL_OPTIONS. _JAVA_OPTIONS cũng có thể hoạt động nhưng không được ghi lại.Các JAVA_TOOL_OPTIONS là yếu ghi nhận, nhưng đây là một số liên kết:

Một ví dụ về sử dụng:

set JAVA_TOOL_OPTIONS=-Dmy.property=sth 

Khi tung ra JVM bạn nên xem thông báo:

Picked up JAVA_TOOL_OPTIONS: ... 
Các vấn đề liên quan