17

我不太确定我是如何陷入这种混乱的,但由于某种原因,我无法使用替代方法来更改 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

Enter 以保留当前选择[+],或输入选择编号:3

[brilewis@myserver]$ java -version

java 版本 "1.5.0_10" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03) Java HotSpot(TM) Server VM (build 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

Enter 以保留当前选择[+],或输入选择编号:

更新:以下是输出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/本地/bin:/bin:/usr/bin:/usr/NX/bin:/home/brilewis/bin

更新(2010 年 4 月 26 日):我按照 Bert 的建议,从 /etc/profile 的 PATH 环境变量中删除了 JAVA_HOME。这样做之后,我能够使用替代方法来更改 Java 的版本。唯一的问题是,当我尝试运行时javac,我得到“-bash: javac: command not found”。当版本设置为 1.5 时不会发生这种情况。

4

6 回答 6

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 RPM 可能已经破坏了您的替代符号链接,因此强制它正常。

ln -sf /etc/alternatives/java /usr/bin/java
于 2012-02-07T16:18:13.893 回答
8

我可以使用以下步骤更改 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以查看结果。

于 2012-02-29T01:26:14.593 回答
4

我能够解决问题的唯一方法是通过删除 /var/lib/alternatives/java 并重新安装每个 JDK 重新开始。我对 javac 和 jar 做了同样的事情。这样做之后,我能够在版本之间切换而没有任何问题。

于 2010-04-26T19:49:33.843 回答
3

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

在这种情况下,从您之前的评论来看,这听起来像是/usr/java/jdk1.5.0_10/bin在路径中的某个地方,应该被删除。

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

于 2010-04-23T19:04:44.083 回答
1

更新了更多解释

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

    $ type java

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

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

    $ echo $JAVA_HOME

    如果设置了此项,则有时会将 java 可执行文件指向不同的 JRE/JDK,而不管java可执行文件本身位于何处。同样,设置它并不少见,但是对于硬编码不同 JAVA_HOME 的任何帐户,您将无法使用 RH 替代品更改 Java 版本。

综上所述,为了在我的帐户中进行开发,我通常在我的路径中设置一个特定的 JDK,并将 JAVA_HOME 设置为指向一个特定的 JDK,而不是依赖于系统设置。RH 替代品可以很好地控制其他包使用的 Java 版本,但是对于我自己的开发,我喜欢明确地针对我想要使用的 Java。

于 2010-04-23T18:50:54.973 回答
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 指定了从属设备,那么 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

希望这可以帮助。

于 2015-04-22T03:39:28.117 回答