2012-12-25 79 views
6

我试图使用Attach API获取在我的机器上运行的所有VM的列表。修复:java.lang.UnsatisfiedLinkError:在java.library.path中不附加

这是我使用的代码:

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(); 
    } 
} 

错误:

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

请让我知道我可以用什么方法来解决这个问题。

我也试过使用System.load(pathToAdd); 我也提到这个Blog post,但它不起作用。 :'(

+1

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

+2

你的pathToAdd直接指向dll,它应该指向包含dll的文件夹。 –

回答

4

您需要:

设置PATH =%PATH%; C:/ Program Files文件/的Java/jdk1.7.0_03/JRE /斌/(在Windows上)

出口LD_LIBRARY_PATH =路径/到/你/库/ DIR /(在Linux或OSX)

符合你的本机库的路径,启动JVM之前

我不认为System.setProperty("java.library.path", pathToAdd);工作;以及这可能是问题的原因。

+0

有没有办法在运行时/编程设置它? –

+2

pathToAdd是错误的,它应该指向目录,而不是dll。你可能应该编写pathToAdd =“C:/ Program Files/Java/jdk1.7.0_03/jre/bin /”(不带attach.dll),或者BETTER可以做System.load(“C:/ Program Files/Java/jdk1.7.0_03/jre/bin/attach.dll“)isntead –

+0

我试过System.load(path/attach.dll);它不起作用。我不知道为什么。难道是因为我正在使用jdk1.7 –

相关问题