`

gentoo下 JAVA生成图片的问题 以及JFreeChart的图片问题

    博客分类:
  • JAVA
阅读更多

===============================
gentoo(linux)系统下图片问题

验证码图片问题或者是说采用以下方案生成图片的问题

{code}
// 创建内存图象并获得其图形上下文
final BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
final Graphics g = image.getGraphics();
{code}


如何解决?

我目前机器上的JDK如下(java-config -L)
JDK发行版:
1)      IcedTea6-bin 1.8.1 [icedtea6-bin]
*)      Sun JDK 1.6.0.21 [sun-jdk-1.6]

解决方案1:
使用sun-jdk-1.6就可以好(java-config -S 1 / java-config -s 1)

但是使用icedtea6-bin会报以下异常:

{code}
java.lang.UnsatisfiedLinkError: /opt/icedtea6-bin-1.8.1/jre/lib/amd64/libfontmanager.so: libfreetype.so.6: cannot open shared

object file: No such file or directory
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1750)
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1667)
        at java.lang.Runtime.loadLibrary0(Runtime.java:840)
        at java.lang.System.loadLibrary(System.java:1047)
        at sun.font.FontManagerNativeLibrary$1.run(FontManagerNativeLibrary.java:61)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.font.FontManagerNativeLibrary.<clinit>(FontManagerNativeLibrary.java:32)
        at sun.font.FontManager$1.run(FontManager.java:233)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.font.FontManager.<clinit>(FontManager.java:230)
        at sun.java2d.SunGraphicsEnvironment$2.run(SunGraphicsEnvironment.java:178)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.java2d.SunGraphicsEnvironment.<init>(SunGraphicsEnvironment.java:162)
        at sun.awt.X11GraphicsEnvironment.<init>(X11GraphicsEnvironment.java:252)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
        at java.lang.Class.newInstance0(Class.java:372)
        at java.lang.Class.newInstance(Class.java:325)
        at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
        at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1152)
        at java.awt.image.BufferedImage.getGraphics(BufferedImage.java:1142)
       
java.lang.NoClassDefFoundError: Could not initialize class sun.font.FontManager
        at sun.java2d.SunGraphicsEnvironment$2.run(SunGraphicsEnvironment.java:178)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.java2d.SunGraphicsEnvironment.<init>(SunGraphicsEnvironment.java:162)
        at sun.awt.X11GraphicsEnvironment.<init>(X11GraphicsEnvironment.java:252)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
        at java.lang.Class.newInstance0(Class.java:372)
        at java.lang.Class.newInstance(Class.java:325)
        at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
        at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1152)
        at java.awt.image.BufferedImage.getGraphics(BufferedImage.java:1142)
{code}

解决方案2:
启动 X11 window server
编辑tomcat的启动脚本,加上export DISPLAY=:0,重启tomcat
无论使用sun jdk还是使用icedtea都会正常,并且jfreechart的问题也能解决
如果关闭了X11 那么Web服务会崩溃掉(503),再启动X11还是不能恢复,还需要重启tomcat

如果设置了export DISPLAY=:0 而没有启动X11 window server会报以下异常:
{code}
java.lang.InternalError: Can't connect to X11 window server using ':0' as the value of the DISPLAY variable.
        at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
        at sun.awt.X11GraphicsEnvironment.access$100(X11GraphicsEnvironment.java:62)
        at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:166)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:142)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:186)
        at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
        at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1152)
        at java.awt.image.BufferedImage.getGraphics(BufferedImage.java:1142)
{code}
如果启动了X11 window server,而没有设置export DISPLAY=:0那么无论使用sun jdk还是使用icedtea都会正常。


==============================

jfreechart生成图片时候会出现错误

这个方法http://lansky07.iteye.com/blog/283899 我没有得到解决。
同一思路的方案 http://www.iteye.com/topic/665688 也没得到解决。
都会出现这个异常:
{code}

java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
        at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)
        at java.awt.Window.<init>(Window.java:432)
        at java.awt.Frame.<init>(Frame.java:403)
        at javax.swing.JFrame.<init>(JFrame.java:202)
        at org.jfree.ui.ApplicationFrame.<init>(ApplicationFrame.java:65)
{code}



解决方法:
1、安装xorg-server (X11 window server)并启动(startx)
2、找到tomcat的启动脚本,加上export DISPLAY=:0,重启tomcat
位置如下:
{code}
init_env_vars() {
        # Populate JAVA_HOME
        JAVA_HOME=`java-config --jre-home`
        export DISPLAY=:0
{code}

如果没有设置export DISPLAY=:0,出错如下:
{code}
java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
        at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:173)
        at java.awt.Window.<init>(Window.java:437)
        at java.awt.Frame.<init>(Frame.java:419)
        at javax.swing.JFrame.<init>(JFrame.java:218)
        at org.jfree.ui.ApplicationFrame.<init>(ApplicationFrame.java:65)
{code}

如果设置了export DISPLAY=:0 而没有安装 x11-libs/libX11,出错如下:
{code}
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:616)
        at org.apache.catalina.startup.Bootstrap.load(Unknown Source)
        at org.apache.catalina.startup.Bootstrap.main(Unknown Source)
Caused by: java.util.ServiceConfigurationError: sun.java2d.cmm.PCMM: Provider sun.java2d.cmm.lcms.LCMS could not be instantiated:

java.lang.UnsatisfiedLinkError: /opt/icedtea6-bin-1.8.1/jre/lib/amd64/xawt/libmawt.so: libX11.so.6: cannot open shared object

file: No such file or directory
        at java.util.ServiceLoader.fail(ServiceLoader.java:224)
        at java.util.ServiceLoader.access$100(ServiceLoader.java:181)
        at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:370)
        at java.util.ServiceLoader$1.next(ServiceLoader.java:438)
        at sun.java2d.cmm.CMSManager$1.run(CMSManager.java:65)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.java2d.cmm.CMSManager.getModule(CMSManager.java:55)
        at java.awt.color.ICC_Profile.activateDeferredProfile(ICC_Profile.java:1100)
        at java.awt.color.ICC_Profile$1.activate(ICC_Profile.java:741)
        at sun.java2d.cmm.ProfileDeferralMgr.activateProfiles(ProfileDeferralMgr.java:93)
        at java.awt.color.ICC_Profile.getInstance(ICC_Profile.java:774)
        at java.awt.color.ICC_Profile.getInstance(ICC_Profile.java:994)
        at java.awt.color.ICC_Profile.getInstance(ICC_Profile.java:959)
        at java.awt.color.ICC_Profile$2.run(ICC_Profile.java:910)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.awt.color.ICC_Profile.getStandardProfile(ICC_Profile.java:905)
        at java.awt.color.ICC_Profile.getInstance(ICC_Profile.java:866)
        at java.awt.color.ColorSpace.getInstance(ColorSpace.java:321)
        at com.sun.imageio.plugins.jpeg.JPEG.<clinit>(JPEG.java:217)
        at com.sun.imageio.plugins.jpeg.JPEGImageReaderSpi.<init>(JPEGImageReaderSpi.java:45)
        at javax.imageio.spi.IIORegistry.registerStandardSpis(IIORegistry.java:175)
        at javax.imageio.spi.IIORegistry.<init>(IIORegistry.java:137)
        at javax.imageio.spi.IIORegistry.getDefaultInstance(IIORegistry.java:159)
        at javax.imageio.ImageIO.<clinit>(ImageIO.java:64)
        at org.apache.catalina.core.JreMemoryLeakPreventionListener.lifecycleEvent(JreMemoryLeakPreventionListener.java:138)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:770)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:524)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:548)
        ... 6 more
Caused by: java.lang.UnsatisfiedLinkError: /opt/icedtea6-bin-1.8.1/jre/lib/amd64/xawt/libmawt.so: libX11.so.6: cannot open shared

object file: No such file or directory
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1750)
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1646)
        at java.lang.Runtime.load0(Runtime.java:787)
        at java.lang.System.load(System.java:1022)
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1750)
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1667)
        at java.lang.Runtime.loadLibrary0(Runtime.java:840)
        at java.lang.System.loadLibrary(System.java:1047)
        at sun.java2d.cmm.lcms.LCMS$1.run(LCMS.java:94)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.java2d.cmm.lcms.LCMS.<clinit>(LCMS.java:88)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:264)
        at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:362)
        ... 32 more
{code}

 

=================
这个事情耗费了我近两天的时间,哪位仁兄在gentoo下面也遇到这个问题了?麻烦赐教,给个好的解决方案。

 

为方便调试,我建立了个缺省包的JAVA文件,可以编译调试

javac -cp ./jcommon-1.0.16.jar:./jfreechart-1.0.13.jar ChartDemo.java
java -cp ./jcommon-1.0.16.jar:./jfreechart-1.0.13.jar:. ChartDemo

 在附件中下载该类和依赖jar包(一个简单的java文件和两个依赖包)。

 

===================================================================

最终解决方案:

以上问题的出现,是一个大错误导致。代码本身写的就有问题,就用到了图形界面的东西,怪不得人家要是要求X11服务呢?

如果你继承了 org.jfree.ui.ApplicationFrame 在此基础上写,就会出现问题

所以请不要继承他,画图的地方直接画就是了,也用不着这个父类的啥方法。

 

恨啊,没看那段代码是如何写的。后面做了这么多测试。

分享到:
评论

相关推荐

    gentoo系统登录问题

    解决gentoo系统在忘记密码无法登录的情况下,通过修改启动脚本,进入命令行修改登录密码,或者更改etc目录的权限

    Gentoo手册

    - **活跃的论坛**:Gentoo拥有一个非常活跃的官方论坛,用户可以在上面交流经验、解决问题。 - **邮件列表**:除了论坛之外,Gentoo还维护着多个邮件列表,供开发者和用户提供反馈和建议。 - **官方文档**:Gentoo...

    在Gentoo Linux下绘制高质量的PostScript矢量图形.pdf

    《在Gentoo Linux下绘制高质量的PostScript矢量图形》这篇文档主要讲述了如何在Gentoo Linux操作系统中利用Perl语言和ips2ps工具包来创建精确的数学矢量图形。PostScript是一种页面描述语言,常用于生成高质量的图形...

    Gentoo Linux 安装手册

    ### Gentoo Linux 安装手册知识点详述 #### 一、引言 - **Gentoo Linux**:Gentoo Linux 是一款高度可定制的 Linux 发行版,它以其灵活性和性能著称。用户可以根据自己的需求调整每一个细节,从内核配置到软件包的...

    gentoo下源码安装postfix+courier-imap+extmail

    本教程将深入探讨如何在Gentoo系统中通过源码编译安装Postfix邮件服务器、Courier-IMAP IMAP/POP3服务器以及Extmail webmail系统,这些都是构建一个完整邮件服务基础设施的关键组件。 **Postfix** Postfix是一款高...

    Gentoo手册pdf

    ### Gentoo安装指南 Gentoo是一个为不同需求提供多种选择的Linux发行版,它允许用户根据自己的需求来编译系统,...Gentoo手册提供了丰富的信息资源,帮助用户在安装过程中解决各种问题,以达到熟练使用Gentoo的目标。

    Gentoo Linux nVidia指南

    Gentoo Linux nVidia指南

    Gentoo Linux 安装文档

    Gentoo Linux 是一款专为开发人员和网络专业人士设计的开源操作系统,它的核心特性在于其独特的包管理系统Portage。Portage借鉴了BSD ports系统,但使用Python编写,具备丰富的功能,如文件依赖、精细包管理、虚拟...

    gentoo的bash配置文件

    本文将深入探讨Gentoo中的bash配置文件,以及如何利用它们来定制控制台的颜色。 首先,我们要了解.bashrc和bash.bashrc这两个文件的作用。`.bashrc`是bash shell的用户级配置文件,通常位于用户的主目录下(`~`)。...

    gentoo 图解安装手册

    5. **挂载分区**:Code Listing 6中,将分区挂载到/mnt/gentoo下,以便后续安装过程可以访问。同时创建并挂载`/mnt/gentoo/proc`,以模拟进程文件系统。 6. **解开Stage压缩文件**:Code Listing 11中,使用`tar`...

    gentoo安装文档.doc.rar

    Gentoo支持多种架构,包括x86(32位)和x86_64(64位),以及其他如PowerPC、ARM等。 3. **获取安装介质**: 你可以通过下载Gentoo的LiveCD或LiveUSB镜像来创建安装媒介。这些镜像包含了基本的工具和系统文件,让你...

    gentoo手册(学习gentoo的参考手册)

    这部分内容介绍了如何配置和使用这些分支,以及如何在特定情况下选择不同的分支版本。 - **Portage工具集**:Portage提供了多种实用工具,如dispatch-conf等,用于辅助软件包管理和系统维护。这部分内容介绍了这些...

    Gentoo Linux AMD64 手册

    首先,手册介绍了解决如何安装Gentoo Linux的基本概念,包括为何选择Gentoo以及它的优势。接着,手册引导读者选择适合自己的安装方法,如网络安装、LiveCD/DVD安装等,不同的安装方式适用于不同的情况和需求。 配置...

    gentoo手册

    【gentoo手册】是 Gentoo Linux 发行版的官方文档,包含了详尽的系统配置、安装和维护信息。这份手册是2013年的最新版本,由社区成员花费大量时间翻译而成,旨在帮助用户理解和使用Gentoo Linux系统。 在手册中,...

    virtualBox 安装X86_64 Gentoo_xfce系统(三)

    安装Gentoo操作系统的基本步骤包括初始化硬件,安装必要的软件包,设置网络,同步Portage仓库,选择合适的配置文件和分区,以及配置引导加载器。在完成这些基础步骤后,系统将允许用户登录到一个基本的命令行环境。 ...

    Gentoo安装手册

    《Gentoo安装手册》是针对Gentoo Linux操作系统的一份详尽指南,旨在帮助用户完成从下载到安装,再到配置的全过程。这份手册由Gentoo官方提供,经过整理,适合打印以便线下查阅。 在Gentoo Handbook中,首先介绍了...

    Gentoo linux的安装和使用手册

    **Gentoo Linux** 是一个基于源代码的Linux发行版,以其高度的可定制性和灵活性而闻名。与其他预编译二进制包的发行版不同,Gentoo 的安装和软件管理过程涉及到编译和配置源代码,这使得用户能够根据自己的需求精确...

Global site tag (gtag.js) - Google Analytics