Windows Jenkins(JDK1.8)下java.awt.Toolkit初始化失败问题求助
Windows Jenkins环境(JDK1.8)自动化测试报错解决
报错信息
java.lang.NoClassDefFoundError: Could not initialize class java.awt.Toolkit at com.pypestream.model.page.aaas.InterfacePage.enterCustomCssCode(InterfacePage.java:465) at com.pypestream.model.page.aaas.InterfacePage$$FastClassBySpringCGLIB$$c2ab0743.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88) at com.pypestream.aop.AspectLogger.processMethod(AspectLogger.java:54) at com.pypestream.aop.AspectLogger.logPage(AspectLogger.java:16) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633) at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) at com.pypestream.model.page.aaas.InterfacePage$$EnhancerBySpringCGLIB$$c20d0dcd.enterCustomCssCode(<generated>) at com.pypestream.test.regressionsuite.Pypes_New_Suit.CSS_ClassName.tc_153789_153791_VerifyThatBotCsvWithCSSClassnameColumnAtTheEndCanBeUploadedInDesignStudio(CSS_ClassName.java:90) at java.util.ArrayList.forEach(ArrayList.java:1259) ... Removed 34 stack frames
触发场景
尝试添加以下CSS代码时触发错误:
(".font_text{\n" + " font-style: italic;\n" + "}")
问题代码(本地正常,Jenkins执行失败)
public page enterdataCode(String name) { $(".view-lines").shouldBe(Condition.visible).click(); System.setProperty("java.awt.headless", "false"); StringSelection stringSelection = new StringSelection(name); Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); clipboard.setContents(stringSelection, null); Actions builder = new Actions(WebDriverRunner.getWebDriver()); builder.keyDown(Keys.CONTROL) .sendKeys(Keys.chord("v")) .keyUp(Keys.CONTROL) .perform(); System.setProperty("java.awt.headless", "true"); return this; }
解决方案
原因分析
Jenkins默认以无头模式运行,缺少AWT工具包依赖的图形环境,导致java.awt.Toolkit无法初始化。代码中动态设置java.awt.headless为false的操作时机太晚,且Jenkins服务本身未配置图形支持。
具体修复方案
方案1:替换剪贴板操作,彻底规避AWT依赖
直接使用WebDriver的输入方法发送文本,无需依赖系统剪贴板:
public page enterdataCode(String name) { WebElement editor = $(".view-lines").shouldBe(Condition.visible).element(); editor.click(); // 全选清空原有内容后输入新文本 Actions builder = new Actions(WebDriverRunner.getWebDriver()); builder.keyDown(Keys.CONTROL) .sendKeys("a") .keyUp(Keys.CONTROL) .sendKeys(Keys.BACK_SPACE) .sendKeys(name) .perform(); return this; }
方案2:配置Jenkins支持图形环境
若必须保留剪贴板操作,需给Jenkins配置图形界面权限:
- 打开Windows服务管理器,找到Jenkins服务,右键选择"属性";
- 切换到"登录"选项卡,勾选"允许服务与桌面交互";
- 在Jenkins全局配置的JVM参数中添加:
-Djava.awt.headless=false。
方案3:提前设置headless参数
将System.setProperty("java.awt.headless", "false")移到测试代码启动的最早期(如测试类的静态代码块),确保在AWT类加载前生效:
static { System.setProperty("java.awt.headless", "false"); }
内容的提问来源于stack exchange,提问作者Sumanth S
相关产品推荐
相关产品推荐

