GNU/LinuxJDK 1.5/1.6的安装及中文显示问题解决方案

作者Terry Wang

个人主页http://imterry.googlepages.com

Blog: http://terrywang.net/archives/143
电子邮件imterry[AT]gmail.com
文档版本v1.3 修改于2008-11-1

初始版本v1.0 2004-10-30

操作系统Fedora Core 2/RHEL5/OEL5/Debian/Ubuntu

JDK版本Sun JDK 1.5.0, Sun JDK 1.6.0


摘要:随着Sun发布J2SE 5.0,即JDK 1.5,众多新特性的加入和JVM性能的改善让人心动。Windows下安装和环境设置以及中文显示自然没什么好说的,简直可以说是傻瓜式的。但是Linux下就不会那么顺利了,尤其是中文字体的显示一直以来总是困扰着初级用户。JDK 1.5.0的中文显示设置和j2sdk 1.4.x时相比已经有了很大的改变。本文着重介绍jdk1.5Linux操作系统下的安装、环境变量设置和中文显示问题的解决。


  1. 首先,从Sun官方网站下载jdk1.5的安装文件,选择正确的Platform和language,一般有Linux x86,x86_64
    下载地址
    http://java.sun.com/javase/downloads/index_jdk5.jsp

Linux RPM in self-extracting file (jdk-1_5_0-linux-i586-rpm.bin)

Linux self-extracting file (jdk-1_5_0-linux-i586.bin)

简单说一下两个安装文件的区别,Linux RPM in self-extracting file是一个把rpm安装包封装在压缩包内的二进制格式,在linux操作系统的命令行下,给文件加上执行的权限chmod a+x jdk-1_5_0-linux-i586-rpm.bin,然后./jdk-1_5_0-linux-i586-rpm.bin之后可以得到jdk-1_5_0-linux-i586.rpm这个rpm包,之后安装rpm包还用多说么?rpm –ivh package-name。前者的好处是容易安装和维护,傻瓜式的。而后者则适合高级的用户,相当于一个zip版本的“绿色”jdk,没有安装程序,安装完之后可能需要做一些链接(具体可以参考jdk安装指南文档)。同样地给后者加上执行权限之后直接执行二进制文件即可得到jdk 1.5.0,一般用户的习惯都是将jdk放在/usr/java下,rpm安装后默认是在/usr/java下。JDK 1.6的rpm.bin有些变化,加上执行权限之后执行,会自动安装所有的包,包括jdk/javadb等等。安装在/usr/java/jdk1.6.0_16下,该目录下还会有两个指向安装目录的soft link,分别是latest和defaut。这样一来,设置环境变量如果直接用JAVA_HOME=/usr/java/latest的话就可以避免升级JDK之后更改path的麻烦,不错。
Installation notes: http://java.sun.com/j2se/1.5.0/install.html


Ubuntu和Ubuntu Server上的安装
Ubuntu用的是Debian GNU/Linux的APT包管理,优点就不谈了。如果使用Debian或者Ubuntu,建议在APT来安装和管理JDK,这样的话省去自己手动更新JDK的痛苦,解决browser plugin问题。在系统中也会自动添加Sun Java Console/Java Web Start/Java Plugin Control Panel/Policy Tools之类的菜单。手动更新需要去下那个self-extract的bin文件然后自己设置环境变量,每次升级JDK之后还需要重新修改,比较麻烦。

Ubuntu Desktop和Server默认都是不装Sun JRE/JDK的,因为是非开源的。Ubuntu Server安装Tomcat的话,会安装openjdk,而非Sun JDK。


安装是非常简单的:
sudo apt-get install sun-java6-jdk sun-java6-fonts sun-java6-plugin
有依赖关系的会自动解决。安装好之后可以用
sudo update-alternatives --config java
选择想用的JDK。如果需要通过.deb包安装的apps用你指定的JRE/JDK来跑,需要编辑/etc/jvm文件。
把路径加入,放在最上方,这里以Ubuntu Intrepid Ibex 8.10为例:
/usr/lib/jvm/java-6-sun-1.6.0.10
d当然原先编辑~/.bash_profile ~/.bashrc和/etc/profile的方法还是适用的,下面是不同配置文件作用域的区别:

Session Wide 不影响GUI程序

~/.profile

~/.bash_profile

~/.bashrc


System Wide

/etc/profile

/etc/bash.bashrc

/etc/environment


更多信息:
https://help.ubuntu.com/community/EnvironmentVariables
https://help.ubuntu.com/community/JavaInstallation

  1. 安装好之后要做的便是环境变量的设置,也可分为三种不同的情况。
    第一种是对于单个用户的的环境变量设置。需要修改用户所对应的.bash_profile文件,同时也可以修改.bashrc,这样每次新开terminal都会生效。我们可以通过vi ~/.bash_profile来编辑当前用户的bash_profile文件,当然你也可以用你自己喜欢的编辑器。在开头或者适当的地方插入一下代码:
    export JAVA_HOME=/usr/java/jdk1.5.0
    export CLASSPATH=.
    export PATH=$JAVA_HOME/bin:$PATH
    然后保存文件,注销重新登陆之后在控制台下输入java –version,如果出现一下信息则说明安装设置已经成功。
    注意:此代码是为了看起来简单,所以没有加上复杂的变量引用,熟悉shell的用户可以参 照第二种方法的代码进行修改。
    java version "1.5.0"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-b64)
    Java HotSpot(TM) Client VM (build 1.5.0-b64, mixed mode, sharing)

    第二种是设置Linux的全局环境变量(需要root权限),修改/etc/profile,在适当的地方加入以下代码:
    JAVA_HOME=/usr/java/jdk1.5.0
    PATH=$JAVA_HOME/bin:$PATH
    CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
    export PATH JAVA_HOME CLASSPATH
    修改完成后保存,注销当前用户重新登陆后按照第一种同样的方法进行测试查看是否成功。
    如果不想注销,可以直接运行 source /etc/profile 来让设置生效。

    第三种是要使JDK在所有的用户中使用,可以这样:
    Vi /etc/profile.d/java.sh
    在新的java.sh中输入以下内容: 
    #Set JDK for all users
    JAVA_HOME=/usr/java/jdk1.5.0
    CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
    PATH=$JAVA_HOME/bin:$PATH
    export PATH JAVA_HOME CLASSPATH

    保存推出,然后给java.sh分配权限:chmod 755 /etc/profile.d/java.sh (755 -rwxr-xr-x)
    至此,基本的安装和环境变量设置已经完成了。

    至于正确显示applet的浏览器的插件安装请查看Sun的文档:
    http://java.sun.com/j2se/1.5.0/install-linux.html#plugin
    http://java.sun.com/j2se/1.5.0/manual_install_linux.html
    接下来要说如何修改配置来正确显示中文字体。

  2. 最后来解决一下中文字体的显示问题。Jdk1.5.0的字体配置和1.4.x的时候相比有了很大的差别。先来看一下不作任何修改的情况下ControlPanel中文字体的显示情况,如图:

    虽然能显示一下中文,但是有一大半是无法正常显示的方块,很不爽。下面我们就来解决这个问题。
    先来看一下Sun公司对JRE1.5.0版的中文字体设置的官方说明中的一些资料:
    介绍一下其字体配置文件的加载方案。其加载顺序为(JavaHomeJRE的根目录,下同):JavaHome/lib/fontconfig.OS.Version.properties
    JavaHome/lib/fontconfig.OS.Version.bfc
    JavaHome/lib/fontconfig.OS.properties
    JavaHome/lib/fontconfig.OS.bfc
    JavaHome/lib/fontconfig.Version.properties
    JavaHome/lib/fontconfig.Version.bfc
    JavaHome/lib/fontconfig.properties
    JavaHome/lib/fontconfig.bfc
    其中,OS字段可以是:
    Windows
    "98", "2000", "Me", "XP", "2003"
    Solaris
    :空。
    Linux
    "Sun", "RedHat", "Turbo", "SuSE"
    Version字段指该OS的版本号。
    在这些配置文件中,仅.properties文件是文本文件。其格式跟JRE1.4.2版的不同。文件分为几段,并在每段开始时标明。
    我们需要关注的仅有两段:Component Font MappingsSearch Sequences。前者指定字体,后者指定要使用的properties的搜索顺序。
    知道了这些,配置起来就简单了。
    看了是不是有点晕,而且觉得没用?不要急下面会用到的。
    先把字体文件Simsun.ttf(可以从Windows下拷贝一份到Linux下)拷贝到JRE的字体目录$JAVA_HOME/jre/lib/fonts下,接着编辑字体目录下的文件fonts.dir,把第一行的数字加1,然后在最后加一行加上:
    simsun.ttf -SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
    然后保存文件。
    最后把字体配置文件改名为fontconfig.RedHat.properties这种形式(Fedora Core x也是Redhat的衍生物),把$JAVA_HOME/jre/lib下多余的fontconfig开头的文件全部移到新建的bak目录下,当然你不备份也可以只是除了问题不要找我^_^
    注意:如果你的Linux不是RedhatFedora Core系列,请按照自己的发行版本对字体配置文件做相应的修改,参照Sun公司的资料,jdsSuseTurbo应该没问题了,至于DebianMandrake我就不得而知了,如果大家按照自己的方式修改成功了请告诉我详细情况以便于我完善这个文档。
    然后再在控制台下执行ControlPanel看看,是不是很爽!如图:

    还有自己的程序也能完美的显示中文字体了!

  3. 参考文献
    Troubleshooting Java 2 SE 5.0
    http://java.sun.com/javase/6/webnotes/trouble/other/troubleshooting-j2se5.html
    Sun
    公司对JRE1.5.0版的中文字体设置的官方说明:
    http://java.sun.com/j2se/1.5.0/docs/guide/intl/fontconfig.html