2012-12-25 32 views
6

Tôi đang cố gắng lấy danh sách tất cả các máy ảo đang chạy trên máy của mình bằng cách sử dụng API đính kèm.Khắc phục: java.lang.UnsatisfiedLinkError: không đính kèm trong java.library.path

Đây là mã tôi đang sử dụng:

import java.lang.reflect.Field; 
import java.util.List; 
import com.sun.tools.attach.*; 

public class JVMListManager 
{ 
    static String pathToAdd = "C:/Program Files/Java/jdk1.7.0_03/jre/bin/attach.dll"; 
    public static void setLibraryPath(String path) throws Exception { 
     System.setProperty("java.library.path", pathToAdd); 

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

    private void listActiveVM() 
    { 
     List<VirtualMachineDescriptor> vm = VirtualMachine.list(); 
     int i= 1; 
     for(VirtualMachineDescriptor vmD : vm) 
     { 
      System.out.println(i + ". " + vmD.displayName()); 
      i++; 
     } 
    } 

    public static void main(String[] args) throws Exception 
    { 
     setLibraryPath(pathToAdd); 

     JVMListManager jvmListManager = new JVMListManager(); 
     jvmListManager.listActiveVM(); 
    } 
} 

LỖI:

java.util.ServiceConfigurationError: com.sun.tools.attach.spi.AttachProvider: Provider sun.tools.attach.WindowsAttachProvider could not be instantiated: java.lang.UnsatisfiedLinkError: no attach in java.library.path

Xin vui lòng cho tôi biết những gì các phương pháp tôi có thể sử dụng để sửa lỗi này.

Tôi cũng đã thử sử dụng System.load (pathToAdd); Ngoài ra tôi đã đề cập đến điều này Blog post, nhưng nó không hoạt động. : '(

+1

Xem http://stackoverflow.com/questions/5565356/java-attach-api-changing-java-library-path-dynamically –

+2

pathToAdd của bạn trỏ trực tiếp vào dll, nó sẽ trỏ đến thư mục chứa dll thay vào đó . –

Trả lời

4

Bạn cần phải:

set PATH =% PATH%; C:/Program Files/Java/jdk1.7.0_03/jre/bin/(trên Windows)

xuất khẩu LD_LIBRARY_PATH = path/to/your/thư viện/dir/(trên Linux hoặc OSX)

tuân thủ với các đường dẫn của thư viện mẹ đẻ của bạn, trước khi khởi chạy jvm

tôi không nghĩ rằng System.setProperty("java.library.path", pathToAdd); đang làm việc;. và điều này có thể là nguyên nhân của sự cố.

+0

Có cách nào để thiết lập điều này khi chạy/lập trình không? –

+2

pathToAdd là sai, nó sẽ trỏ đến thư mục, không phải là dll. Bạn có lẽ nên viết pathToAdd = "C:/Program Files/Java/jdk1.7.0_03/jre/bin /" (không có attach.dll), hoặc BETTER bạn có thể làm System.load ("C:/Program Files/Java/jdk1.7.0_03/jre/bin/attach.dll ") isntead –

+0

Tôi đã thử System.load (path/attach.dll); Nó không hoạt động. Tôi không biết tại sao. Nó có thể được, bởi vì tôi đang sử dụng jdk1.7 –

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