使用替代方法更改 Java 版本时出现问题

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2701100/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 11:00:09  来源:igfitidea点击:

Problem changing Java version using alternatives

javarhel5

提问by Brian

I'm not quite sure how I got into this mess, but for some reason I'm not able to change the current version of Java using alternatives. I can run alternatives --config java and type my selection but when I echo the version number for either java or javac, it spits back out 1.5 every time (despite alternatives showing the current version is 1.6). The server I'm working with is running RHEL5, by the way.

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

I have verified that the paths used in alternatives are pointing to the correct directories. Here's some output from my session:

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

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

There are 3 programs which provide 'java'.

Selection Command

** 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 to keep the current selection[+], or type selection number: 3

[brilewis@myserver]$ java -version

java version "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, mixed mode)

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

There are 3 programs which provide 'java'.

Selection Command

** 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 to keep the current selection[+], or type selection number:

[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 版本“1.5.0_10” Java(TM) 2 运行时环境,标准版(构建 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

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

UPDATE: The following is the output of echo $PATH:

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

/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

UPDATE (4/26/10): I followed Bert's suggestion and removed JAVA_HOME from the PATH environment var in /etc/profile. After doing this, I was able to use alternatives to change the version of Java. The only problem is that when I try to run javac, I get "-bash: javac: command not found". This does not happen when the version is set to 1.5.

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

采纳答案by Brian

The only way I was able to solve the problem was to start over again by removing /var/lib/alternatives/java and installing each JDK again. I did the same for javac and jar. After doing this, I was able to switch between versions without any issues.

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

回答by Bert F

Updated with more explanations

更新了更多解释

  1. Check which javaexecutable is really running, e.g.

    $ type java

    If this shows something other than /usr/bin/java, then you've likely got a specific JRE/JDK hardcoded in your path. This is fine, but you won't be able to use change Java versions using RH alternatives for any account that hardcodes a specific JRE/JDK in its PATHin this way. However, other packages/accounts (e.g. system processes) that don't hardcode a specific JDK version into its path will use the alternatives-specified JRE.

  2. Check your JAVA_HOMEenvironment variable, e.g.

    $ echo $JAVA_HOME

    If this is set, this will sometimes point the java executable at a different JRE/JDK, regardless of where the javaexecutable itself lives. Again, its not unusual to set this, but you won't be able to use change Java versions using RH alternatives for any account that hardcodes a different JAVA_HOME.

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

    $ type java

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

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

    $ echo $JAVA_HOME

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

All that said, for development in my account, I normally set a specific JDK in my path and set JAVA_HOME to point to a specific JDK, rather than rely on the system settings. RH alternatives is fine to control what Java version other packages use, but for my own development, I like to explicitly target the Java I want to use.

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

回答by Powerlord

alternativesworks by changing a symlink in the /usr/bindirectory. However, if your path contains a valid executable earlier in the path, that will be used instead.

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

In this case, judging from your previous comments, it sounds like /usr/java/jdk1.5.0_10/binis somewhere in the path and should be removed.

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

For a BASH shell, the path is usually set in ~/.bashrcor (less likely?) ~/.bash_profile

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

回答by user783522

For Oracle Java 6u30, once you've installed their RPMs you can configure alternatives:

对于 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

Then activate the configuration:

然后激活配置:

/usr/sbin/alternatives --config java

And select /usr/java/default/bin/java from the menu.

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

Plus you must gzip the man pages

另外,您必须 gzip 手册页

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

Also, the Oracle java RPMs might have clobbered your alternatives symlink so force it to be normal.

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

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

回答by djangofan

I can change the default Java on CentOS using these steps:

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

  1. Add the IBM JDK:

    alternatives --install /usr/bin/java java /opt/WebSphere/AppServer/java/bin/java 3
    
  2. Set the new IBM JDK as default:

    alternatives --config java   (then select #3 in the list)
    
  3. Type java -versionat the prompt to see the result.

  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在提示符下看到的结果。

回答by WingsOfPain

When using the alternatives method, if you want to use an alternative, it must first be installed. I believe RPMs would include this as a part of the install, but in the case where manual installs are performed, you can still manually install. For example, with java,

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

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

What this does is to install an alternative for the java symlink. For each slave, it also builds/updates the symlink to some other value specified in another alternative, when you switch it. So if you were to switch to a different version of java using alternatives, and the alternative specifies a slave for javac, javac will repoint to the new version as well.

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

My full list is as follows:

我的完整列表如下:

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

Hope this helps.

希望这可以帮助。