如何在Windows 7上关闭无头图形环境

时间:2012-04-04 21:54:18

标签: java eclipse windows-7 headless awtrobot

我设法打破了一个正在运行的应用程序,并且无法解决如何修复它。

我有一个java网络应用程序,它运行在Eclipse中的Windows7盒子上的“tc服务器”上(spring STS版本。)

该应用程序将使用java.awt.robot执行屏幕捕获,并在后续页面上显示捕获的图像。

到目前为止一直很好,我已经能够从屏幕上收集bufferedImage并将其显示在web-app中的后续页面上。

然后我以某种方式打破了网络应用程序,可能正在加载Android SDK和Eclipse工具。

现在,我从Robot获得异常,因为它无法在HeadlessEnvironment中运行。 Google搜索表明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)

3 个答案:

答案 0 :(得分:2)

已解决的问题: 在Eclipse中的服务器启动配置中,有一组配置参数,其中包括语句:

-Djava.awt.headless=true

通过在Eclipse中创建另一个服务器配置并选择“基础”类型而不是“Insight”类型的tc服务器实例,我能够获得一个非无头环境。

似乎tc服务器的“Insight”类型坚持无头运行环境(虽然我没有进一步调查。)

答案 1 :(得分:1)

由于您提到“web-app”,应用服务器是否作为Windows服务运行?如果您在服务面板中,则会出现“与桌面交互”复选框,这可能会导致您出现症状。

enter image description here

答案 2 :(得分:0)

切换到新的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 ....

现在我将无头设置为true并再次运行,仍然使用MobaXTerm:

$ java -Djava.awt.headless=true GetGraphics
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment

现在终于可以使用像这样的putty来运行它了:

$ java GetGraphics
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment

结论:用于连接服务器的客户端可能会导致图形问题。在我的案例中,使用JFreeChart的图表停止了工作。切换回putty解决了这个问题。