2011-08-02 39 views
12

Tôi có thể đặt java.library.path lập trình từ mã java không?Cài đặt Java.library.path có lập trình

Các mục sau không hoạt động.

System.setProperty("java.library.path", "/blah"); 
+0

Nếu nó không hoạt động, tại sao bạn yêu cầu? –

+3

Tôi có nghĩa là đoạn trích mà tôi đưa ra không hoạt động. – Fakrudeen

Trả lời

15

Không, bạn không thể. Thuộc tính này là giá trị chỉ đọc. Bạn có thể thay đổi nó lúc launchin JVM với:

-Djava.library.path=your_path 

Nếu bạn muốn tải một thư viện từ một địa điểm cụ thể, bạn có thể sử dụng thay vì System.load(libraryPath) với đường dẫn đầy đủ đến thư viện.

+0

Tôi muốn chấp nhận cả hai câu trả lời, nhưng như tôi có thể chấp nhận chỉ có một tôi sẽ đi với điều này, như hack mát dựa trên chi tiết thực hiện. – Fakrudeen

16

Có lẽ sự giúp đỡ này http://blog.cedarsoft.com/2010/11/setting-java-library-path-programmatically/

[Chỉnh sửa] liên kết là chết, vì vậy tôi nêu lên ở đây

sao chép từ http://blog.cedarsoft.com/2010/11/setting-java-library-path-programmatically/

Khi rối tung xung quanh với JNI, một phải đặt “Java.library.path” tương ứng. Thật không may là cách duy nhất là thêm một tài sản hệ thống trước ứng dụng được bắt đầu:

java -Djava.library.path =/path/to/libs

giống như

java -Djava .library.path = C: \ Java \ ljwgl \ libs org.mypackage.MyProgram Thay đổi thuộc tính hệ thống sau này không có hiệu lực, vì thuộc tính được đánh giá rất sớm và được lưu trong bộ nhớ cache. Nhưng những kẻ trên jdic đã khám phá ra cách làm việc xung quanh nó. Đó là một chút bẩn - nhưng hey, những hack là lý do tất cả chúng ta yêu Java ...

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

Trường trườngSysPath = ClassLoader.class.getDeclaredField ("sys_paths" ); fieldSysPath.setAccessible (true); fieldSysPath.set (null, null); Giải thích

Lúc đầu, thuộc tính hệ thống được cập nhật với giá trị mới. Điều này có thể là đường dẫn tương đối - hoặc có thể bạn muốn tạo đường dẫn đó động.

Trình nạp lớp có trường tĩnh (sys_paths) có chứa các đường dẫn . Nếu trường đó được đặt thành null, nó được khởi tạo tự động. Do đó buộc lĩnh vực mà thành vô giá trị sẽ cho kết quả vào việc tái thẩm định của đường dẫn thư viện càng sớm càng LoadLibrary() được gọi ...

+0

+1 - Rất tuyệt vời hack - Tôi sẽ cố gắng này như là phương sách cuối cùng [điều này là rất mát mẻ, nhưng khủng khiếp cho bảo trì!]. – Fakrudeen

+0

Vui lòng trích dẫn các phần có liên quan của bài viết trong câu trả lời của bạn vì liên kết có thể bị chết (mà bạn có). –

-3
import java.util.Map; 

public class ReadingEnvironment { 

    public static void main(String[] args) { 
     System.out.println("Reading System Environment Variables:\n"); 
     // System.out.println(System.getenv()); 
     Map<String, String> env = System.getenv(); 
     for (String envName : env.keySet()) { 
      System.out.format("%s=%s%n", envName, env.get(envName)); 
     } 
    } 
} 
+4

Điều này có trả lời được câu hỏi không? Nó in ra một danh sách các biến, nó không đặt bất kỳ. – berry120

-1

Có nó sẽ đọc các biến môi trường. Sau đây là mã để thiết lập biến môi trường sử dụng ini4j.

import java.io.IOException; 
import org.ini4j.Reg; 


public class SettingWinEnvironmentUsing_ini4j { 

    public static void main(String args[]) 
    { 
     System.out.println("Setting System Environment Variables"); 

     Reg reg = new Reg(); 
     Reg.Key env = reg.add("HKEY_CURRENT_USER\\Environment"); 
     env.put("RR_PROPERTY_PATH", "c:\\path"); 
     try { 
      reg.write(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     System.out.println(env.get("RR_PROPERTY_PATH")); 
    } 
} 

Bạn có thể tìm jar ini4j tại

http://cropforge.org/plugins/scmsvn/viewcvs.php/IAPlugin/lib/ini4j-0.5.2-SNAPSHOT.jar?rev=656&root=icisjavatools&view=log

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