最近给公司重装服务器,测试发邮件时遇到了异常: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target,经过不断的百度,google,终于把问题定位在java证书。可是以前同样安装jdk1.6.0_20的机器没有问题啊,怎么回事呢?
使用rpm -qa |grep java一查,原来IT安装linux时默认安装了java-1.4.2-gcj-compat-1.4.2.0-40jpp.115,虽然环境变量PATH配成了jdk1.6.0_20,可使用which java,whereis java找到的还是/usr/bin/java。由于/usr/bin/java使用的还是java-1.4.2-gcj,导致实际应用的JVM等估计是java-1.4.2-gcj的。怎么解决呢?本想使用rpm -e java-1.4.2-gcj-compat-1.4.2.0-40jpp.115卸载java-1.4.2-gcj,谁知道Failed dependencies,总不能都卸载吧,万一有我不知道的用处呢。
然后继续百度,google,终于找到了方法,那就是alternatives。
alternatives是Linux下的一个功能强大的命令。只能在root权限下执行。如系统中有几个命令功能十分类似,却又不能随意删除,那么可以用 alternatives 来指定一个全局的设置。
alternatives常用于同一个系统中安装同一软件的多个版本。比如为了开发需要,我需要安装JDK1.4.2,同时还需要JDK1.6.10,我怎么样才能忽略安装路径,按照我自己的意思,使用我想要的java版本呢?
下面为您一一道来。
alternatives的命令行执行如下:
[root@localhost ~]# alternatives
alternatives version 1.3.30.2 - Copyright (C) 2001 Red Hat, Inc.
This may be freely redistributed under the terms of the GNU Public License.
usage: alternatives --install <link> <name> <path> <priority>
[--initscript <service>]
[--slave <link> <name> <path>]*
alternatives --remove <name> <path>
alternatives --auto <name>
alternatives --config <name>
alternatives --display <name>
alternatives --set <name> <path>
common options: --verbose --test --help --usage --version
--altdir <directory> --admindir <directory>
说明:
alternatives --install <link> <name> <path> <priority>
其中,
install表示安装
link是符号链接
name则是标识符
path是执行文件的路径
priority则表示优先级
以java的安装为例,我的rhel下自带了一种java版本,分别如下:
Selection Command
-----------------------------------------------
* +1 /usr/lib/jvm/jre-1.4.2-gcj/bin/java
我在目录/opt/app安装了java version "1.6.0_20"
[root@localhost test]# alternatives --install /usr/bin/java java /opt/app/jdk1.6.0_20/bin/java 2
[root@localhost test]# alternatives --config java
There are 2 programs which provide 'java'.
Selection Command
-----------------------------------------------
*+ 1 /usr/lib/jvm/jre-1.4.2-gcj/bin/java
2 /opt/app/jdk1.6.0_20/bin/java
Enter to keep the current selection[+], or type selection number: 2
用alternatives --config java就可以选择你想要的Java版本。然后重启应用,再次发送email,结果还是一样有Exception,晕了。
继续找,找到/etc/java,里面有个java.conf设置了JVM_ROOT等参数,难道是它。按我的理解修改了几乎每个参数,可仍然不起作用。
最后灵机一闪,reboot,哈哈,终于起作用了,邮件发出去了,Exception消失了。
综上所述,修改/etc/java/java.conf是不必要的(这个文件的作用以后再研究),只要alternatives就可以了,当然最后别忘了重启机器。