【问题标题】:java.awt.Color errorjava.awt.颜色错误
【发布时间】:2009-01-09 09:17:37
【问题描述】:

我有这个简单的 Jsp 页面:

<%@ page language="java" import="java.awt.Color"%> <%
Color background = Color.white;
%>

失败并出现以下错误:

java.lang.NoClassDefFoundError
    at _text__jsp._jspService(/text.jsp:3)
    at com.caucho.jsp.JavaPage.service(JavaPage.java:75)
    at com.caucho.jsp.Page.subservice(Page.java:506)
    at com.caucho.server.http.FilterChainPage.doFilter(FilterChainPage.java:182)
    at com.caucho.server.http.Invocation.service(Invocation.java:315)
    at com.caucho.server.http.CacheInvocation.service(CacheInvocation.java:135)
    at com.caucho.server.http.RunnerRequest.handleRequest(RunnerRequest.java:346)
    at com.caucho.server.http.RunnerRequest.handleConnection(RunnerRequest.java:274)
    at com.caucho.server.TcpConnection.run(TcpConnection.java:139)
    at java.lang.Thread.run(Thread.java:534)

我在 Resin 2.1.13 上运行它。

知道是什么原因造成的吗?

【问题讨论】:

    标签: java jsp resin


    【解决方案1】:

    过去我在 servlet 容器中使用过 AWT 类。需要处理的问题是,在服务器系统上,可能没有运行 AWT 可以连接的图形显示器,这默认会导致它失败。

    解决方案是传递一个系统属性,告诉 AWT 它正在“无头”系统上运行。通常,这是通过将“-Djava.awt.headless=true”传递给 java 命令行来完成的。

    以下是关于 Resin 完成此操作的参考:http://www.caucho.com/support/resin-interest/0209/0062.html。该线程中的 OP 也报告了 NoClassDefFound 错误。

    【讨论】:

    • 据我所知,对于无头的东西,你会得到一些显示错误。
    【解决方案2】:

    不确定这个问题。我可以在我的 Tomcat 中成功运行您的代码。可能这个问题是 Resin 特有的。或者,正如 Dave 所说,可能是一个无头问题。

    最好的办法是在某些 POJO 中转换图像,然后将其发送到浏览器,或者将其保存在磁盘上的某个位置,然后将其链接到 JSP 中。如果问题仍然存在,请尝试在无头模式下运行,正如 Dave 指出的那样。

    此外,重要的是要了解 JSP 是一种用于 Web 的视图技术,并且不能进行那种图形操作。

    【讨论】:

    • 您能否提供有关容器不允许加载 AWT 的信息的参考?我似乎记得我曾经使用过的一个系统使用 AWT 类来创建一个图像,然后将其转换为 GIF。
    • 糟糕——我误读了答案,你说它不允许在 JSP 中使用它们,但它允许它们在普通对象中使用。尽管如此,我还是有兴趣看到这方面的参考。
    • 不,规格中没有任何内容。实际上,我可以轻松地在 Tomcat 中运行这段代码,没有任何问题。它一定是别的东西,可能是你提到的无头的东西。或者可能是 Resin 特有的这个问题。相应地编辑我的帖子。
    【解决方案3】:

    我在 Linux 上的 Tomcat 上遇到了同样的问题。我会间歇性地收到此消息。这是由于操作系统上打开的文件描述符的数量最大化。

    我不确定 Java 如何根据需要加载类,但我认为这个限制阻止了它从运行时加载它需要的类。

    我按照此处列出的这些说明进行操作:

    How do I change the number of open files limit in Linux?

    即:

    在 /etc/security/limits.conf 中设置硬限制

    * hard nofile 64000
    

    注销并再次登录,然后运行:

    ulimit -n 64000
    

    在启动 Tomcat 之前在我的 shell 会话中。 我将上述命令添加到我的 .bashrc 文件中,以确保每次登录时都设置了限制。

    【讨论】:

      【解决方案4】:

      某些带有 -server 选项的 VM 不加载 java.awt。完全打包(也没有 javax.swing 和其他)

      这是为了避免加载不需要的类。

      顺便说一句,班级

      java.awt.Color
      

      在 jsp 页面中没有任何用处。它用于在 java 桌面应用程序中显示颜色。

      你想做什么?也许有更好的方法。

      【讨论】:

      • Oscar,在这种情况下,如果我们在同一个应用程序的 POJO 中执行此操作,甚至都不可能。那么,您的意思是我们需要另一个应用程序 - 为了实现这一点 - 在另一个 JVM 中?
      • 我不得不重新阅读你的评论好几次,直到我明白了! : - ) 你是对的!, -server 用于指定一些策略以使 VM 运行。正如你所说,这个限制是由它自己的servlet容器施加的。好点子。
      猜你喜欢
      • 2012-02-08
      • 2021-07-02
      • 1970-01-01
      • 2018-08-23
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多