Jacob报错java.lang.NoSuchFieldError问题排查求助
问题:Jacob连接AutoIt时出现
NoSuchFieldError错误 我用以下Java脚本借助Jacob连接AutoIt:
File file = new File("lib", "jacob-1.20-x64.dll"); System.setProperty(LibraryLoader.JACOB_DLL_PATH, file.getAbsolutePath()); AutoItX x = new AutoItX(); String Openfile = "Open"; try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } x.winActive(Openfile); x.winWaitActive(Openfile); // 控制文件选择窗口 x.controlClick("Open", "", "1001"); x.send("C:\\MVS_TEAM\\MVS_Automation_Tests"); x.send("{ENTER}!n", false ); x.sleep(2000); x.controlClick("Open", "", "1"); x.send(TemplateName); x.send("{ENTER}!n", false ); x.sleep(1000); x.send("{ENTER}!n", false );
但运行时遇到如下错误:
java.lang.NoSuchFieldError: com.jacob.activeX.ActiveXComponent.m_pDispatch J at com.jacob.com.Dispatch.createInstanceNative(Native Method) at com.jacob.com.Dispatch.<init>(Dispatch.java:101) at com.jacob.activeX.ActiveXComponent.<init>(ActiveXComponent.java:58) at autoitx4java.AutoItX.<init>(AutoItX.java:231) at StagingEnv_CAMS_Tests.Get_VW_Petrol_Stage.Test_Case(Get_VW_Petrol_Stage.java:181) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:577) at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:139) at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:677) at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:221) at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50) at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:962) at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:194) at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:148) at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.testng.TestRunner.privateRun(TestRunner.java:806) at org.testng.TestRunner.run(TestRunner.java:601) at org.testng.SuiteRunner.runTest(SuiteRunner.java:433) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:427) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:387) at org.testng.SuiteRunner.run(SuiteRunner.java:330) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1256) at org.testng.TestNG.runSuitesLocally(TestNG.java:1176) at org.testng.TestNG.runSuites(TestNG.java:1099) at org.testng.TestNG.run(TestNG.java:1067) at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66) at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)
我已确认lib目录中的Jacob和AutoIt jar包、已注册的autoItX.dll均正常,请问该如何解决这个Jacob相关的错误?
解决方案
这个错误核心原因是Jacob的JAR包与本地DLL版本不匹配,Native方法调用时找不到对应类的字段,按以下步骤修复:
- 严格匹配版本:确保使用的Jacob JAR包版本和
jacob-1.20-x64.dll完全一致,比如DLL是1.20版本,JAR必须是jacob-1.20.jar,不能混用其他版本。 - 清理依赖冲突:检查项目依赖,移除旧版本或重复的Jacob JAR包,避免类加载时版本混乱。
- 匹配系统位数:x64版本的DLL必须运行在64位JVM环境下,不能用32位JDK启动程序。
- 验证DLL加载路径:可以尝试将DLL放到JRE的
bin目录,或系统PATH包含的目录中,避免路径加载失败;也可以打印file.getAbsolutePath()确认路径是否正确。 - 清理缓存重启:重启IDE和测试环境,清除旧的类加载缓存。
内容的提问来源于stack exchange,提问作者Shiva Kumar
相关产品推荐
相关产品推荐

