2011-04-06 33 views
14

Khi sử dụng API com.sun.tools.attach trên máy tính Windows của tôi, tôi nhận được lỗi sau khi thực hiện một cuộc gọi đếnJava Đính kèm API: thay đổi java.library.path động

VirtualMachine.list() 

java. lang.UnsatisfiedLinkError: không đính kèm trong java.library.path

Lý do là tệp attach.dll bị thiếu. Attach.dll nằm ở $JRE/bin/. Khi bắt đầu chương trình Java của tôi với -Djava.library.path=[Directory to the attach.dll] mọi thứ hoạt động mà không có đầu ra lỗi.

Bây giờ, tôi không muốn thêm mọi chương trình Java khởi động thông số JVM xấu xí này. Do đó, câu hỏi của tôi là:

  1. Máy của tôi chưa được định cấu hình đúng và $JRE/bin/ phải nằm trong đường dẫn thư viện?

  2. Nếu không, làm cách nào để thêm đường dẫn động? System.setProperties("java.library.path",StringOfThePathToTheAttach.dll); không hoạt động. Đường dẫn thư viện đã được thay đổi, nhưng vẫn còn lỗi ứng dụng. Điều này có liên quan gì đến SecurityManager hoặc JVM không?

+0

Sau khi bạn thay đổi đường dẫn thư viện, bạn có đang sử dụng Trình nạp lớp mới không? –

+0

@ joseph-ottinger: không, tôi đoán tôi nên? –

Trả lời

5

System.setProperty("java.library.path", StringOfThePathToTheAttach.dll); của bạn sẽ hoạt động. Tôi đoán là bạn đang gọi nó quá muộn. Nói cách khác, có một nỗ lực để truy cập DLL trước khi bạn thiết lập thuộc tính.

Bạn có thể xuất giá trị hiện tại cho java.library.path sau khi thuộc tính được đặt trong mã và một lần nữa trước cuộc gọi phương thức vi phạm không?

tức là Nếu bạn thấy thông báo "Trước khi attach.dll gọi" trước khi thấy "Sau khi đặt thuộc tính", bạn biết vấn đề của mình ở đâu.

Edit:

Cách tốt hơn để trỏ đến thư viện có nguồn gốc là sử dụng System.load(StringOfThePathToTheAttach.dll) - một lần nữa, trước khi dòng vi phạm mã.

+0

@ Teddy-yueh Tôi không chắc chắn, nếu đó là nhiệm vụ của tôi để tải các tập tin dll. Sau khi tất cả trên máy Ubuntu của tôi, đường dẫn thư viện attach.so đã được liên kết. Tôi đoán máy tính windows của tôi đã được cấu hình kém. –

5
System.setProperty("java.library.path", System.getProperty("java.library.path") + File.pathSeparator + FOLDER_THAT_CONTAINS_ATTACH_DLL); 
+5

Đó là một giải pháp thực sự khủng khiếp nếu bạn không cuộn sang bên phải;) – JustinKSU

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