如何使用别名来切换不同版本的Java?

6

我有一些只能在Java 8上运行的工具。所以我下载了Java 8,但现在我同时安装了两个版本的Java(操作系统:Ubuntu):

java-1.11.0-openjdk-amd64      1101       /usr/lib/jvm/java-1.11.0-openjdk-amd64
java-1.8.0-openjdk-amd64       1081       /usr/lib/jvm/java-1.8.0-openjdk-amd64

我的问题是:是否可以通过不同的别名调用这两个版本?例如,我输入:
  • “java”调用java 11(默认值)
  • “java8”调用java 8

1
type -a java 会输出什么?你可能已经有了一个名为 java 的符号链接,它指向特定的 Java 编译器。 - Arkadiusz Drabczyk
它说“java是/usr/bin/java”,这应该默认为11? - litaoshen
现在是/usr/bin/java文件。 - Arkadiusz Drabczyk
/usr/bin/java:符号链接到/etc/alternatives/java,我猜是Java11? - litaoshen
你的主机操作系统是什么?请在问题中编辑此信息。 - Basil Bourque
显示剩余3条评论
3个回答

6
您可以用几种方法来实现。最简单的方法是将以下两行放入您的配置文件初始化文件中:
alias java='/usr/lib/jvm/java-1.11.0-openjdk-amd64/bin/java'
alias java8='/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java'

其他方法取决于您是否是机器的管理员。您可以创建类似于以下软链接:

/usr/bin/java -> /usr/lib/jvm/java-1.11.0-openjdk-amd64 (不建议使用,因为系统中某些工具可能依赖于 /usr/bin/java)。

更新:如果可以,请尝试使用sdkman。它可以简化安装Java版本和设置 JAVA_HOME 环境变量的工作。


将Java指向"/usr/bin/java"不是更好吗?这样可以避免系统更新等方面的任何混淆。 - newbie
1
/usr/lib/jvm/java-1.11.0-openjdk-amd64 是一个目录,我认为我应该添加 /bin/java - litaoshen
有时候,如果您有其他工具使用了 /usr/bin/java 并期望它是某个版本,但您将其更改为指向版本 11 或其他版本,则可能会遇到问题。通常情况下,这不是什么大问题,但您可能会遇到一些微妙的问题。 - apatniv
别名在脚本中不能被识别 -- 使用Debian替代系统选择解释器要好得多,因为这不仅适用于在shell中直接调用,还适用于从另一个程序(如构建脚本或IDE!)调用。 - Charles Duffy
@VivekAkupatni 在配置文件中的别名也适用于非交互模式,即脚本吗? - Maxim
除非你做些什么,否则它在非交互模式下无法工作。一种方法是将设置放在一个常见的bash脚本中,比如common_utils.sh,并在开头引用该文件 source common_utils.sh - apatniv

0

你同样可以为JAVA_HOME这样做:

alias java8="export JAVA_HOME=`/usr/libexec/java_home -v 1.8`"
alias java11="export JAVA_HOME=`/usr/libexec/java_home -v 11`"

更新: 要直接运行Java,请使用:

$ alias java8="`/usr/libexec/java_home -v 1.8`/bin/java"

$ alias java11="`/usr/libexec/java_home -v 11`/bin/java"

$ java8 -version

java version "1.8.0_281"
Java(TM) SE Runtime Environment (build 1.8.0_281-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.281-b09, mixed mode)

$ java11 -version

openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)

你也可以硬编码你的路径。


0
我有一些只能在Java 8上运行的工具。所以我下载了Java 8,但现在我在同时安装两个版本的Java(操作系统:Ubuntu)。
你可以使用别名(参见其他答案),但这有一个问题,仅当shell定义或加载别名时才会受到shell的尊重:
别名不会通过环境继承。
一个工具的启动脚本是否看到别名通常取决于您是否将别名定义放入正确的shell init文件中。
还有可能应用程序的启动脚本会假定java8或java11是一个真实的(绝对或相对)路径名,并尝试通过文件系统解析它。
简而言之,在您的用例中使用别名的机会很小。

因此,更好的想法是安排适当的Java在命令搜索路径上。您可以通过以下几种方式实现:

  1. 您可以使用Ubuntu的“alternatives”系统在Java 8和Java 11之间进行全局切换。
  2. 您可以更新PATH变量,以便(例如)Java 11可执行文件出现在Java 8可执行文件之前。这可以在shell init文件(每个用户或全局),应用程序启动脚本中完成...或手动完成。
  3. 您甚至可以将“/usr/bin/java”或其他内容替换为直接符号链接到要使用的版本。(这很粗糙,我不建议这样做。)请注意,“/usr/bin”中的Java命令条目可能已经是符号链接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接