【问题标题】:How to use different java version by alias?如何通过别名使用不同的java版本?
【发布时间】:2019-02-27 06:42:04
【问题描述】:

我有一些工具只能由 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

【问题讨论】:

  • type -a java 说什么?您可能已经拥有java,它是指向特定 java 编译器的符号链接。
  • 它说java is /usr/bin/java应该默认为11?
  • 现在是file /usr/bin/java
  • /usr/bin/java: symbolic link to /etc/alternatives/java 我猜是java11?
  • 哦,你可能有 Debian 的东西。 java -version 说什么?

标签: java bash shell


【解决方案1】:

您可以通过多种方式做到这一点。最简单的方法是将以下两行放入您的配置文件初始化文件中:

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" 不是更好吗?它将避免在系统更新等方面产生任何混淆。
  • /usr/lib/jvm/java-1.11.0-openjdk-amd64 是一个我认为应该添加 /bin/java 的目录
  • 有时你可能会遇到问题,如果你有其他工具,你 /usr/bin/java 并期望它是某个版本,但你将它更改为指向版本 11 或其他东西。一般来说,这不是什么大问题,但您可能会遇到一些微妙的问题。
  • 脚本不支持别名——最好使用 Debian 替代系统来选择要使用的解释器,因为这不仅适用于 shell 的直接调用,而且适用于调用 来自另一个程序(如构建脚本或IDE!)。
  • @VivekAkupatni 配置文件中的别名是否也可以在非交互模式下工作,即在脚本中?
【解决方案2】:

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

您可以使用别名来执行此操作(请参阅其他答案),但这有一个问题,即只有 shell 才会尊重别名……而且只有当它具有由 shell 定义或加载的别名时:

  • 别名不是通过环境继承的。

  • 工具的启动脚本是否会看到别名通常取决于您是否将别名定义放入正确 shell 初始化文件中。

  • 应用程序的启动脚本也可能会假定java8java11 是真正的(绝对或相对)路径名,并尝试通过文件系统解析它。

简而言之,使用别名很有可能在您的用例中不起作用。


因此,更好的办法是安排适当的 Java 在命令搜索路径上。您可以通过多种不同的方式做到这一点:

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

【讨论】:

    【解决方案3】:

    您也可以对 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)
    

    您也可以对路径进行硬编码。

    【讨论】:

      猜你喜欢
      • 2014-01-06
      • 2013-09-01
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多