单元测试出错Native library for Attach API not available in this JRE

来源:互联网 发布:宁波知乎 编辑:程序博客网 时间:2024/05/17 22:49

转自:

http://blog.csdn.net/gold_fly/article/details/7732413

http://techiedan.com/2009/10/19/set-up-jdk-in-eclipse/



偶然一天,运行eclipse单元测试,报错:

[html] view plaincopy
  1. java.lang.IllegalStateException: Native library for Attach API not available in this JRE  
  2.     at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:81)  
  3.     at mockit.internal.startup.JDK6AgentLoader.loadAgent(JDK6AgentLoader.java:54)  
  4.     at mockit.internal.startup.AgentInitialization.initializeAccordingToJDKVersion(AgentInitialization.java:21)  
  5.     at mockit.internal.startup.Startup.initializeIfNeeded(Startup.java:208)  
  6. java.lang.IllegalStateException: Native library for Attach API not available in this JRE  
  7.     at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:81)  
  8.     at mockit.internal.startup.JDK6AgentLoader.loadAgent(JDK6AgentLoader.java:54)  
  9.     at mockit.internal.startup.AgentInitialization.initializeAccordingToJDKVersion(AgentInitialization.java:21)  
  10.     at mockit.internal.startup.Startup.initializeIfNeeded(Startup.java:208)  

检查了下,发现由于最近jmockit升级,导致eclipse的参数出了问题影响的。进入eclipse-->preference-->TestNG-->Run/Debug,这里有个设置运行时JVM args,把jmockit.jar设置下,格式为:-javaagent:D:\repository\com\alibaba\external\test.jmockit\0.999.11\test.jmockit-0.999.11.jar。

重新跑单元测试,运行正常!问题解决;

这个出错有点奇怪,通过出错类,进行跟踪,发现最后的出错信息如下:

[html] view plaincopy
  1.  Class  JDK6AgentLoader{  
  2. private VirtualMachine attachToThisVM()  
  3.    {  
  4.       try {  
  5.          return VirtualMachine.attach(pid);  
  6.       }  
  7.       catch (AttachNotSupportedException e) {  
  8.          throw new RuntimeException(e);  
  9.       }  
  10.       catch (IOException e) {  
  11.          throw new RuntimeException(e);  
  12.       }  
  13.    }  
  14.  private VirtualMachine getVirtualMachineImplementationFromEmbeddedOnes()  
  15.    {  
  16.       try {  
  17.          if (File.separatorChar == '\\') {  
  18.             return new WindowsVirtualMachine(ATTACH_PROVIDER, pid);  
  19.          }  
  20.          else {  
  21.             return new LinuxVirtualMachine(ATTACH_PROVIDER, pid);  
  22.          }  
  23.       }  
  24.   catch (AttachNotSupportedException e) {  
  25.          throw new RuntimeException(e);  
  26.       }  
  27.       catch (IOException e) {  
  28.          throw new RuntimeException(e);  
  29.       }  
  30.       catch (UnsatisfiedLinkError e) {  
  31.          throw new IllegalStateException("Native library for Attach API not available in this JRE", e);  
  32.       }  
  33. }  

通过文件路径判断是windwo,还是linux操作系统,从代码看catch并抛出异常的处理很常见;

[html] view plaincopy
  1. WindowsVirtualMachine{   
  2. static  
  3. /*     */   {  
  4. /* 167 */     System.loadLibrary("attach");  
  5. /* 168 */     init();  
  6. /* 169 */     stub = generateStub();  
  7. /*     */   }  
  8. }  
如果没有-javaagent,那么上面的代码就回出错,而这部分是虚拟机启动的装载初始化操作,所以javaagent设置的是虚拟机启动初始化类;

jmockit里面用到了jdk6.0的不少特性,jdk6.0的动态修改和装载还是挺强大的。


【yasi】遇到相同的问题,是这样解决的:

参考这篇帖子,将工程的Library中的 JRE7 换成 JDK 1.7,如图



0 0
原创粉丝点击