2012-08-10 100 views
0

在Maven中運行JUnit測試時,我得到以下異常。使用maven運行JUnit測試時拋出異常

java.lang.IllegalStateException: Native library for Attach API not available in this JRE 
    at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:81) 
    at mockit.internal.startup.JDK6AgentLoader.loadAgent(JDK6AgentLoader.java:54) 
    at mockit.internal.startup.AgentInitialization.initializeAccordingToJDKVersion(AgentInitialization.java:21) 
    at mockit.internal.startup.Startup.initializeIfNeeded(Startup.java:96) 
    at mockit.integration.junit4.JMockit.<clinit>(JMockit.java:23) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) 
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) 
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) 
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) 
    at org.apache.maven.surefire.junit4.JUnit4TestSet.<init>(JUnit4TestSet.java:45) 
    at org.apache.maven.surefire.junit4.JUnit4DirectoryTestSuite.createTestSet(JUnit4DirectoryTestSuite.java:56) 
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.locateTestSets(AbstractDirectoryTestSuite.java:96) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.maven.surefire.booter.SurefireBooter.getTestSets(SurefireBooter.java:455) 
    at org.apache.maven.surefire.booter.SurefireBooter.runSuitesForkPerTestSet(SurefireBooter.java:406) 
    at org.apache.maven.surefire.booter.SurefireBooter.run(SurefireBooter.java:249) 
    at org.apache.maven.plugin.surefire.SurefirePlugin.execute(SurefirePlugin.java:537) 
    at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:556) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:535) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180) 
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328) 
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138) 
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:362) 
    at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315) 
    at org.codehaus.classworlds.Launcher.launch(Launcher.java:255) 
    at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430) 
    at org.codehaus.classworlds.Launcher.main(Launcher.java:375) 
Caused by: java.lang.UnsatisfiedLinkError: Native Library C:\Program Files\Java\jdk1.6.0_25\jre\bin\attach.dll already loaded in another classloader 
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1772) 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1724) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:823) 
    at java.lang.System.loadLibrary(System.java:1028) 
    at sun.tools.attach.WindowsVirtualMachine.<clinit>(WindowsVirtualMachine.java:169) 
    at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:68) 
    ... 44 more 

我在我的測試中使用了嘲笑。使用的框架是JMockit。任何幫助表示讚賞。

回答

0

我會試試看。這說是這樣的:java.lang.UnsatisfiedLinkError中:本地庫C:

所致\ Program Files文件\的Java \ jdk1.6.0_25 \ jre的\ BIN \ attach.dll已裝入另一個類加載器

我的猜測是,你試圖加載DLL兩次?有一次,也許它被加載爲一個Maven的依賴和一次從JDK?

+0

好的...如果猜測是真的,那麼我怎樣才能防止兩次加載? –

+0

@SnehaParameswaran你可以嘗試從jdk中刪除dll,並將其從maven中刪除。據我所知,即使你會發現dll的依賴在maven中,也很難忽略它。你可以從JDK中刪除DLL並試一試。 – Uvedenrodee

1

我不知道爲什麼會發生這種「attach.dll」的重複加載(稍後會進行調查),但可以通過使用「-javaagent」JVM初始化參數來避免此問題。詳情請參閱here

0

嘗試添加tools.jar到你的類路徑。如果您已經下載了JDK,它通常位於JDK根目錄下的Contents/Home/lib/tools.jar中。如果你使用Eclipse,check out this answer在另一個問題上。