3

動作中のアプリケーションを壊してしまいましたが、修正方法がわかりません。

Eclipse内からWindows7ボックスの「tcサーバー」で実行されるJava Webアプリがあります(春のSTSバージョン)。

アプリは java.awt.robot を使用して画面キャプチャを実行し、キャプチャした画像を次のページに表示します。

これまでのところうまくいき、画面から bufferedImage を収集して、Web アプリ内の後続のページに表示することができました。

そして、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)
4

3 に答える 3

3

解決された問題: Eclipse 内のサーバー起動構成内には、次のステートメントを含む一連の構成パラメーターがあります。

-Djava.awt.headless=true

Eclipse で別のサーバー構成を作成し、「インサイト」タイプの tc サーバー インスタンスではなく「ベース」タイプを選択することで、ヘッドレスではない環境を取得できました。

tc サーバーの「Insight」タイプは、ヘッドレス実行環境を主張しているように見えました (ただし、これ以上調査しませんでした)。

于 2012-04-07T11:55:18.293 に答える
1

「web-app」とおっしゃいましたが、アプリ サーバーは Windows サービスとして実行されますか? サービス パネルを使用している場合は、「デスクトップと対話する」チェックボックスがあり、これが症状を引き起こす可能性があります。

ここに画像の説明を入力

于 2012-04-05T00:34:18.877 に答える
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 ....

ここで headless を true に設定し、MobaXTerm を使用して再度実行します。

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

最後に、次のようにパテを使用してこれを実行できます。

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

結論: サーバーへの接続に使用するクライアントによって、グラフィックの問題が発生する可能性があります。私の場合、JFreeChart を使用したグラフが機能しなくなりました。パテに戻すとこれが解決しました。

于 2018-03-20T15:18:16.770 に答える