Caused by: java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment

本文解决了一种常见问题:当使用Tomcat启动服务时,遇到由于X-server未启动导致的NoClassDefFoundError错误。通过设置CATALINA_OPTS参数为-Djava.awt.headless=true,可以避免此错误,确保服务正常运行。

启动服务

./catalina.sh run

报错信息

Caused by: java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:103)
    at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
    at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1181)
    at java.awt.image.BufferedImage.getGraphics(BufferedImage.java:1170)
    at com.benz.utils.RandomNumUtil.init(RandomNumUtil.java:49)
    at com.benz.utils.RandomNumUtil.<init>(RandomNumUtil.java:19)
    at com.benz.utils.RandomNumUtil.Instance(RandomNumUtil.java:26)
    at com.benz.action.CmsAdminAction.getImgCode(CmsAdminAction.java:113)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
    ... 35 more


Caused by: java.awt.AWTError: Can't connect to X11 window server using 'localhost:12.0' as the value of the DISPLAY variable.
    at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
    at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65)
    at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:115)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:74)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:103)
    at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
    at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1181)
    at java.awt.image.BufferedImage.getGraphics(BufferedImage.java:1170)
    at com.benz.utils.RandomNumUtil.init(RandomNumUtil.java:49)
    at com.benz.utils.RandomNumUtil.<init>(RandomNumUtil.java:19)
    at com.benz.utils.RandomNumUtil.Instance(RandomNumUtil.java:26)
    at com.benz.action.CmsAdminAction.getImgCode(CmsAdminAction.java:113)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
    ... 35 more

原因分析

       Java服务器处理图形元素,这些API需要运行一个X-server以便能使用AWT(Abstract Window Toolkit, 抽象窗口工具集),因此之所以报错是因为,tomcat在启用时,Xserver服务没有启动。

 

catalina.sh 添加CATALINA_OPTS=-Djava.awt.headless=true
 

#!/bin/sh
CATALINA_OPTS=-Djava.awt.headless=true

 

 

 

在geoserver发布图层后,点击预览,界面显示错误为HTTP ERROR 500 javax.servlet.ServletException: org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class java.awt.GraphicsEnvironment$LocalGE URI:/geoserver/nys/wms STATUS:500 MESSAGE:javax.servlet.ServletException: org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class java.awt.GraphicsEnvironment$LocalGE SERVLET:dispatcher CAUSED BY:javax.servlet.ServletException: org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class java.awt.GraphicsEnvironment$LocalGE CAUSED BY:org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class java.awt.GraphicsEnvironment$LocalGE CAUSED BY:java.lang.NoClassDefFoundError: Could not initialize class java.awt.GraphicsEnvironment$LocalGE CAUSED BY:java.lang.ExceptionInInitializerError: Exception java.lang.IllegalAccessError: superclass access check failed: class org.marlin.pisces.MarlinRenderingEngine (in unnamed module @0x2c650d8d) cannot access class sun.java2d.pipe.RenderingEngine (in module java.desktop) because module java.desktop does not export sun.java2d.pipe to unnamed module @0x2c650d8d [in thread "qtp2024542466-145"]
最新发布
06-14
<think>我们正在处理一个关于GeoServer图层预览时出现HTTP500错误的问题,具体错误是`NoClassDefFoundError`和`IllegalAccessError`,涉及`java.awt.GraphicsEnvironment$LocalGE`类。根据引用[1],这个错误通常是因为GeoServer运行在没有图形界面的环境中,而它尝试使用JavaAWT进行图形渲染(如生成WMS地图)时失败。###问题分析1.**错误原因**:-`NoClassDefFoundError:Couldnotinitializeclassjava.awt.GraphicsEnvironment$LocalGE`:这表明JVM在尝试初始化`GraphicsEnvironment$LocalGE`类时失败,通常是因为缺少图形环境(如XServer)。-`IllegalAccessError`:可能是由于类加载器问题或JAR包冲突导致访问权限异常。2.**环境因素**:-GeoServer在无头(headless)环境(即没有显示设备、键盘或鼠标的环境)中运行时,无法初始化AWT图形上下文。-服务器环境(如Linux服务器)通常没有图形界面。###解决方案####方法1:启用Headless模式在启动GeoServer时,设置JVM参数`-Djava.awt.headless=true`,强制使用Headless模式,这样AWT操作会在无图形界面的情况下使用替代方案。**操作步骤**:1.找到GeoServer的启动脚本(如`startup.sh`或`startup.bat`)。2.JAVA_OPTS环境变量中添加`-Djava.awt.headless=true`。-例如,在`startup.bat`(Windows)中:```batsetJAVA_OPTS=%JAVA_OPTS%-Djava.awt.headless=true```-在`startup.sh`(Linux)中:```bashexportJAVA_OPTS="$JAVA_OPTS-Djava.awt.headless=true"```3.重启GeoServer。####方法2:检查图形环境(仅适用于有图形界面的环境)如果服务器有图形界面(如安装了XServer),确保GeoServer有权限访问它。但通常生产环境是无头的,因此方法1更通用。####方法3:检查JAR包冲突`IllegalAccessError`可能表示存在JAR包版本冲突。检查GeoServer的`WEB-INF/lib`目录下是否有多个版本的AWT相关JAR包,或与其他库冲突。**操作步骤**:1.进入GeoServer安装目录下的`WEB-INF/lib`。2.检查是否有重复或版本不一致的`java-awt`相关JAR包。3.移除冲突的JAR包(注意备份),保留GeoServer官方要求的版本。####方法4:升级或重装GeoServer如果问题由系统升级(如Windows10升级到Windows11,引用[3])引起,考虑:-重新下载并安装与当前系统兼容的GeoServer版本。-确保设置正确的环境变量(如`GEOSERVER_HOME`)。####方法5:检查环境变量和权限-确保`GEOSERVER_HOME`环境变量正确设置(引用[3])。-以管理员权限运行GeoServer(Windows)或使用`sudo`(Linux),但更推荐正确配置目录权限。###验证解决1.重启GeoServer。2.尝试预览图层,检查是否仍出现500错误。3.查看GeoServer日志文件(位于`logs`目录),确认错误是否消失。###引用说明-引用[1]解释了`NoClassDefFoundError`的原因,指导我们设置Headless模式。-引用[3]提到系统升级后权限问题,但本问题更可能是Headless模式导致。§§相关问题§§1.如何配置GeoServer在Linux服务器上作为服务启动?2.GeoServer常见的HTTP500错误有哪些原因?3.如何调试GeoServer的WMS服务?</think>### GeoServer图层预览出现HTTP 500错误的解决方案 您遇到的`NoClassDefFoundError`和`IllegalAccessError`错误通常与Java图形环境(AWT)初始化失败有关,尤其在无图形界面的服务器环境中。以下是系统性的解决方案: --- #### **核心解决方案** 1. **启用Headless模式** 在GeoServer启动脚本中强制启用无头模式,避免AWT尝试访问物理显示设备: - 修改`startup.bat`(Windows)或`startup.sh`(Linux),在`JAVA_OPTS`中添加: ```bash -Djava.awt.headless=true ``` *示例(Windows)*: ```bat set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m -Djava.awt.headless=true ``` - **效果**:解决`NoClassDefFoundError: java.awt.GraphicsEnvironment$LocalGE`错误[^1]。 2. **修复JAR包冲突** `IllegalAccessError`常由依赖冲突引起: - 检查`GEOSERVER_HOME/webapps/geoserver/WEB-INF/lib`目录: - 删除重复或低版本的`sqlite-jdbc-*.jar`(引用[4]问题) - 移除非官方插件(如社区版JAR包) - 重新下载兼容的依赖包(如[sqlite-jdbc最新版](https://github.com/xerial/sqlite-jdbc))。 --- #### **辅助措施** 3. **环境变量与权限修复** - 确认`GEOSERVER_HOME`环境变量已设置(引用[3]): ```bat set GEOSERVER_HOME=C:\geoserver ``` - **Windows 11专属**:以管理员身份运行`startup.bat`(解决权限问题[^3])。 4. **图形库兼容性** 安装基础图形库(Linux环境): ```bash sudo apt install libxrender1 libxtst6 libxi6 # Debian/Ubuntu ``` --- #### **验证步骤** 1. 重启GeoServer后访问: `http://localhost:8080/geoserver/web/` 2. 测试WMS预览(引用[5]格式): ```url http://localhost:8080/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=[图层名]&bbox=... ``` 3. 检查日志: - `GEOSERVER_HOME/logs/geoserver.log` 确认无`GraphicsEnvironment`报错。 > **结果**:启用Headless模式后,地图渲染将使用虚拟缓冲区而非物理显卡,预览功能恢复正常[^1]。 --- #### **预防措施** - **生产环境建议**: - 在Linux服务器部署时,始终启用`-Djava.awt.headless=true` - 使用Docker镜像(如`kartoza/geoserver`)规避环境问题 - **版本管理**: 避免跨大版本升级操作系统(如Win10→Win11),优先测试GeoServer兼容性[^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值