使用替代方案更改Java版本的问题

时间:2010-04-23 18:36:19

标签: java rhel5

我不太确定我是如何陷入这种混乱的,但由于某种原因,我无法使用替代方案更改当前版本的Java。我可以运行替代方案--config java并输入我的选择但是当我回显java或javac的版本号时,它每次吐出1.5(尽管替代显示当前版本是1.6)。顺便说一下,我正在使用的服务器正在运行RHEL5。

我已经验证了替代品中使用的路径指向正确的目录。这是我的会话的一些输出:

  

[brilewis @ myserver] $ sudo   / usr / sbin / update-alternatives --config   的java

     

有3个程序提供   的Java'。

     

选择命令

     

** 1 /usr/lib/jvm/jre-1.4.2-gcj/bin/java
  + 2 /usr/java/jdk1.5.0_10/bin/java
      3 /usr/java/jdk1.6.0_16/bin/java

     

输入以保持当前状态   选择[+]或类型选择号:3

     

[brilewis @ myserver] $ java -version

     

java version“1.5.0_10”Java(TM)2 Runtime   环境,标准版(构建   1.5.0_10-b03)Java HotSpot(TM)服务器VM(版本1.5.0_10-b03,混合模式)

     

[brilewis @ myserver] $ sudo / usr / sbin / update-alternatives --config java

     

有3个程序提供'java'。

     

选择命令

     

** 1 /usr/lib/jvm/jre-1.4.2-gcj/bin/java
       2 /usr/java/jdk1.5.0_10/bin/java
  + 3 /usr/java/jdk1.6.0_16/bin/java

     

输入以保留当前选择[+]或类型选择号:

更新:以下是echo $PATH

的输出
  

/usr/java/jdk1.5.0_10/bin:/usr/local/apache-ant-1.7.1/bin:/usr/local/apache-tomcat-6.0.24:/usr/kerberos/bin:的/ usr / local / bin中:/ bin中:在/ usr / bin中:在/ usr / NX / bin中:/家庭/ brilewis / bin中

更新(4/26/10):我遵循了Bert的建议,并从/ etc / profile中的PATH环境var中删除了JAVA_HOME。执行此操作后,我能够使用替代方法来更改Java的版本。唯一的问题是,当我尝试运行javac时,我得到“-bash:javac:command not found”。当版本设置为1.5时,不会发生这种情况。

6 个答案:

答案 0 :(得分:32)

对于Oracle Java 6u30,一旦安装了RPM,就可以配置替代方案:

/usr/sbin/alternatives --install "/usr/bin/java" "java" "/usr/java/default/bin/java" 2 \
--slave /usr/bin/javac javac /usr/java/default/bin/javac \
--slave /usr/bin/javadoc javadoc /usr/java/default/bin/javadoc \
--slave /usr/bin/jar jar /usr/java/default/bin/jar \
--slave /usr/bin/keytool keytool /usr/java/default/bin/keytool \
--slave /usr/bin/orbd orbd /usr/java/default/bin/orbd \
--slave /usr/bin/pack200 pack200 /usr/java/default/bin/pack200 \
--slave /usr/bin/rmid rmid /usr/java/default/bin/rmid \
--slave /usr/bin/rmiregistry rmiregistry /usr/java/default/bin/rmiregistry \
--slave /usr/bin/servertool servertool /usr/java/default/bin/servertool \
--slave /usr/bin/tnameserv tnameserv /usr/java/default/bin/tnameserv \
--slave /usr/bin/unpack200 unpack200 /usr/java/default/bin/unpack200 \
--slave /usr/share/man/man1/java.1.gz java.1.gz /usr/java/default/man/man1/java.1.gz \
--slave /usr/share/man/man1/keytool.1.gz keytool.1.gz /usr/java/default/man/man1/keytool.1.gz \
--slave /usr/share/man/man1/orbd.1.gz orbd.1.gz /usr/java/default/man/man1/orbd.1.gz \
--slave /usr/share/man/man1/pack200.1.gz pack200.1.gz /usr/java/default/man/man1/pack200.1.gz \
--slave /usr/share/man/man1/rmid.1.gz rmid.1.gz /usr/java/default/man/man1/rmid.1.gz \
--slave /usr/share/man/man1/rmiregistry.1.gz rmiregistry.1.gz /usr/java/default/man/man1/rmiregistry.1.gz \
--slave /usr/share/man/man1/servertool.1.gz servertool.1.gz /usr/java/default/man/man1/servertool.1.gz \
--slave /usr/share/man/man1/tnameserv.1.gz tnameserv.1.gz /usr/java/default/man/man1/tnameserv.1.gz \
--slave /usr/share/man/man1/unpack200.1.gz unpack200.1.gz /usr/java/default/man/man1/unpack200.1.gz

然后激活配置:

/usr/sbin/alternatives --config java

从菜单中选择/ usr / java / default / bin / java。

另外,你必须gzip手册页

gzip /usr/java/default/man/man1/*.1

此外,Oracle java RPMs可能已经破坏了您的替代符号链接,因此强制它是正常的。

ln -sf /etc/alternatives/java /usr/bin/java

答案 1 :(得分:6)

我可以使用以下步骤更改CentOS上的默认Java:

  1. 添加IBM JDK:

    alternatives --install /usr/bin/java java /opt/WebSphere/AppServer/java/bin/java 3
    
  2. 将新的IBM JDK设置为默认值:

    alternatives --config java   (then select #3 in the list)
    
  3. 在提示符下键入java -version以查看结果。

答案 2 :(得分:3)

alternatives通过更改/usr/bin目录中的符号链接来工作。但是,如果路径中包含路径中较早的有效可执行文件,则会使用该路径。

在这种情况下,从您之前的评论判断,听起来/usr/java/jdk1.5.0_10/bin位于路径中的某个位置,应该删除。

对于BASH shell,路径通常设置为~/.bashrc或(不太可能?)~/.bash_profile

答案 3 :(得分:3)

我能够解决问题的唯一方法是重新开始,删除/ var / lib / alternatives / java并再次安装每个JDK。我为javac和jar做了同样的事情。完成此操作后,我能够在没有任何问题的情况下在版本之间切换。

答案 4 :(得分:1)

更新了更多解释

  1. 检查哪个java可执行文件正在运行,例如

    $ type java

    如果这显示的不是/usr/bin/java,那么您的路径中可能会有一个特定的JRE / JDK硬编码。这很好,但是对于以PATH方式对其中的特定JRE / JDK进行硬编码的任何帐户,您将无法使用RH替代版本来更改Java版本。但是,未将特定JDK版本硬编码到其路径中的其他包/帐户(例如系统进程)将使用alternatives指定的JRE。

  2. 检查您的JAVA_HOME环境变量,例如

    $ echo $JAVA_HOME

    如果设置了这个,这有时会将java可执行文件指向不同的JRE / JDK,无论java可执行文件本身存在于何处。同样,设置它并不罕见,但是对于任何硬编码不同JAVA_HOME的帐户,您将无法使用RH替代版本的Java版本。

  3. 所有这一切,对于我帐户中的开发,我通常在我的路径中设置一个特定的JDK并将JAVA_HOME设置为指向特定的JDK,而不是依赖于系统设置。 RH备选方案可以控制其他软件包使用的Java版本,但对于我自己的开发,我喜欢明确地定位我想要使用的Java。

答案 5 :(得分:0)

使用替代方法时,如果要使用替代方法,则必须先安装。我相信RPM会将其作为安装的一部分包含在内,但在执行手动安装的情况下,您仍然可以手动安装。例如,使用java,

alternatives --install "/usr/bin/java" "java" "/usr/java/example/bin/java" \
 --slave /usr/bin/javac javac /usr/java/example/bin/javac \
 ...

这样做是为java符号链接安装替代方法。对于每个从属服务器,当您切换时,它还会将符号链接构建/更新为另一个替代方案中指定的其他值。因此,如果你使用替代品切换到不同版本的java,并且替代方案指定了javac的slave,javac也将重新命名为新版本。

我的完整清单如下:

alternatives --install /usr/bin/java java /usr/java/<version>/bin/java 1500 \
  --slave /usr/bin/ControlPanel ControlPanel /usr/java/<version>/jre/bin/ControlPanel \
   --slave /usr/bin/jar jar /usr/java/<version>/bin/jar \
   --slave /usr/bin/javac javac /usr/java/<version>/bin/javac \
   --slave /usr/bin/javaws javaws /usr/java/<version>/bin/javaws \
   --slave /usr/bin/jcontrol jcontrol /usr/java/<version>/bin/jcontrol \
   --slave /usr/bin/keytool keytool /usr/java/<version>/bin/keytool \
   --slave /usr/bin/orbd orbd /usr/java/<version>/bin/orbd \
   --slave /usr/bin/pack200 pack200 /usr/java/<version>/bin/pack200 \
   --slave /usr/bin/policytool policytool /usr/java/<version>/bin/policytool \
   --slave /usr/bin/rmid rmid /usr/java/<version>/bin/rmid \
   --slave /usr/bin/rmiregistry rmiregistry /usr/java/<version>/bin/rmiregistry \
   --slave /usr/bin/servertool servertool /usr/java/<version>/bin/servertool \
   --slave /usr/bin/tnameserv tnameserv /usr/java/<version>/bin/tnameserv \
   --slave /usr/bin/unpack200 unpack200 /usr/java/<version>/bin/unpack200 \
   --slave /usr/share/man/man1/java.1 java.1 /usr/java/<version>/man/man1/java.1  \ 
   --slave /usr/share/man/man1/javac.1 javac.1 /usr/java/<version>/man/man1/javac.1  \ 
   --slave /usr/share/man/man1/javaws.1 javaws.1 /usr/java/<version>/man/man1/javaws.1  \ 
   --slave /usr/share/man/man1/keytool.1 keytool.1 /usr/java/<version>/man/man1/keytool.1  \ 
   --slave /usr/share/man/man1/orbd.1 orbd.1 /usr/java/<version>/man/man1/orbd.1  \ 
   --slave /usr/share/man/man1/pack200.1 pack200.1 /usr/java/<version>/man/man1/pack200.1  \ 
   --slave /usr/share/man/man1/policytool.1 policytool.1 /usr/java/<version>/man/man1/policytool.1  \ 
   --slave /usr/share/man/man1/rmid.1 rmid.1 /usr/java/<version>/man/man1/rmid.1  \ 
   --slave /usr/share/man/man1/rmiregistry.1 rmiregistry.1 /usr/java/<version>/man/man1/rmiregistry.1  \ 
   --slave /usr/share/man/man1/servertool.1 servertool.1 /usr/java/<version>/man/man1/servertool.1  \ 
   --slave /usr/share/man/man1/tnameserv.1 tnameserv.1 /usr/java/<version>/man/man1/tnameserv.1  \ 
   --slave /usr/share/man/man1/unpack200.1 unpack200.1 /usr/java/<version>/man/man1/unpack200.1

希望这有帮助。