如何在 Windows 7 上关闭无头图形环境
Posted
技术标签:
【中文标题】如何在 Windows 7 上关闭无头图形环境【英文标题】:How can I turn off headless graphics environment on windows7 【发布时间】:2012-04-18 16:09:58 【问题描述】:我设法破坏了一个正在运行的应用程序,但不知道如何修复它。
我有一个 java web 应用程序,它在 Eclipse(春季 STS 版本)内的 Windows7 机器上的“tc 服务器”上运行。
应用程序将使用 java.awt.robot 执行屏幕捕获,并将捕获的图像显示在后续页面上。
到目前为止一切顺利,我已经能够从屏幕上收集缓冲图像并将其显示在网络应用程序的后续页面上。
然后我以某种方式破坏了网络应用程序,可能正在加载 android SDK 和 Eclipse 工具。
现在,我收到了 Robot 的异常,因为它无法在 HeadlessEnvironment 中运行。 谷歌搜索表明 headlessEnvironment 是在没有屏幕和键盘的情况下运行的,但我两者都有。 该应用程序以前可以正常工作,但从未遇到 HeadlessEnvironment。
如果我调试并显示 GraphicsEnvironment;
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
我得到一个基于 Win32GraphicsEnvironment 的 HeadlessGraphicsEnvironment 对象。
同时:
String nm = java.security.AccessController.doPrivileged
(new sun.security.action.GetPropertyAction("java.awt.graphicsenv", null));
System.out.println("java.awt.graphicsenv = " + nm);
给了
java.awt.graphicsenv = sun.awt.Win32GraphicsEnvironment
我对 android 的糟糕升级导致我最初放弃升级并重新安装最新的 SpringSource 工具集。这遇到了HeadlessEnvironment问题,所以我已经恢复到我原来的eclipse版本,现在也有同样的问题。
我现在感觉很卡,大多数搜索都告诉我如何打开无头模式,谁能解释一下如何再次关闭无头模式?
非常感谢!
05-Apr-2012 18:42:51 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [viewerServlet] in context with path [/WebView] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: java.awt.AWTException: headless environment] with root cause
java.awt.AWTException: headless environment
at java.awt.Robot.<init>(Robot.java:75)
at uk.co.fred.MSWindowsHandler.WindowHandlerUtilities.setupRobot(WindowHandlerUtilities.java:191)
at uk.co.fred.MSWindowsHandler.WindowHandlerUtilities.scanWindow(WindowHandlerUtilities.java:71)
at uk.co.fred.Scanner.ScanServiceImpl.scanScreenToBufferedImage(ScanServiceImpl.java:66)
at uk.co.fred.viewer.controller.scan.control.ScanControlController.postPage_control_Scan(ScanControlController.java:57)
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.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at com.springsource.insight.collection.tcserver.request.HttpRequestOperationCollectionValve.traceNextValve(HttpRequestOperationCollectionValve.java:112)
at com.springsource.insight.collection.tcserver.request.HttpRequestOperationCollectionValve.invoke(HttpRequestOperationCollectionValve.java:94)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:279)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
【问题讨论】:
我们需要你看到的堆栈跟踪! 好的,没问题。最初的 AWT 异常之前被捕获,但为了清楚起见,我将其作为 runtimeException 抛出。 【参考方案1】:既然您提到了“web-app”,那么应用服务器是否作为 Windows 服务运行?如果您在服务面板中,则有一个“与桌面交互”复选框可能会导致您的症状。
【讨论】:
您好 Chuck,很遗憾,应用服务器没有作为 Windows 服务运行。好主意,感谢您的建议。【参考方案2】:已解决的问题: 在 Eclipse 的服务器启动配置中,有一组配置参数,其中包括以下语句:
-Djava.awt.headless=true
通过在 Eclipse 中创建另一个服务器配置并选择“基本”类型而不是“洞察”类型的 tc 服务器实例,我能够获得一个非无头环境。
tc 服务器的“Insight”类型似乎坚持使用无头运行环境(尽管我没有进一步调查。)
【讨论】:
如果您深入了解您提供的堆栈跟踪(在 Eclipse 中使用 F3),那么您可以看到 GraphicsEnvironment.getHeadlessProperty 检查系统属性 (-D) 值。本来打算这么建议的,但为时已晚。很好地解决了它,+1 在这里跟进它!【参考方案3】:我在切换到新的 SSH 客户端时遇到了这个问题。我一直使用腻子没有问题。使用 Putty,Java 将以无头模式运行。当我使用 MobaXTerm 时,Java 尝试连接到 X11 服务器。我确信某处有一个设置可以修复 MobaXTerm,因此不会发生这种情况,还有一个 Putty 中的设置可能会导致同样的问题。
我使用此代码(感谢 OP)来验证这是我的问题:
import java.awt.GraphicsEnvironment;
public class GetGraphics
public static void main(String[] args)
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
String nm = java.security.AccessController.doPrivileged
(new sun.security.action.GetPropertyAction("java.awt.graphicsenv", null));
System.out.println("java.awt.graphicsenv = " + nm);
首先在与 MobaXTerm 连接的服务器上运行它:
$javac GetGraphics.java
$java GetGraphics
我收到了这个错误:
Xlib: connection to "localhost:10.0" refused by server
Xlib: MobaXterm X11 proxy: unable to connect to forwarded X server: Network error: Connection refused
Exception in thread "main" java.awt.AWTError: Can't connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variable.
.... More stack trace ....
现在我将 headless 设置为 true 并再次运行,仍然使用 MobaXTerm:
$ java -Djava.awt.headless=true GetGraphics
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
现在我终于可以像这样使用 putty 运行它了:
$ java GetGraphics
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
结论:您用来连接服务器的客户端可能会导致图形问题。在我的情况下,使用 JFreeChart 的图表停止工作。切换回腻子解决了这个问题。
【讨论】:
以上是关于如何在 Windows 7 上关闭无头图形环境的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 8 上设置 Magento 环境? [关闭]
如何在无头 wordpress 环境中确保图像请求的 CORS?
如何在 Windows 7 上查找 MAC 地址? [关闭]