云计算百科
云计算领域专业知识百科平台

【云原生技术】 `ssh -l 目标服务器 ‘java -version‘`情况排查jdk版本问题

ssh -l 目标服务器 'java -version'情况

  • 一、ssh -l 目标服务器 ’Java-version‘ 这个命令执行出来的 jdk是谁的jdk?
  • 二、ssh -l user 目标服务器 "java -version",目标服务器上明明安装的是 JDK 17,但却返回了 Java 1.8
    • 如何排查
    • 结论
  • 三、update-alternatives –config java 可以看到系统当前默认链接的是 Java 1.8。,为什么ssh -l 目标服务器 ’Java-version‘ 是默认的jdk吗?
  • 四、通过 update-alternatives –config java 在系统层面将 JDK 17 选为默认 具体怎么配置?
    • 1. 确保系统已安装 JDK 17
    • 2. 注册到 update-alternatives
    • 3. 切换默认版本
    • 4. 验证
      • 小结

一、ssh -l 目标服务器 ’Java-version‘ 这个命令执行出来的 jdk是谁的jdk?

使用 ssh -l 目标服务器 'java -version' 时,真正被调用的 java 是目标服务器上的 Java 解释器(即远程主机上的 JDK)。

  • 您在本地执行该命令后,SSH 会登录到“目标服务器”,在那台服务器执行 java -version,因此输出的是目标服务器所安装的 JDK 版本。
  • 本地主机自己的 JDK 不会对此命令产生影响。

二、ssh -l user 目标服务器 “java -version”,目标服务器上明明安装的是 JDK 17,但却返回了 Java 1.8

当您在本地主机上执行 ssh -l user 目标服务器 "java -version",实际上会在“目标服务器”上执行 java -version,按理说应显示目标服务器的 JDK 版本。如果目标服务器上明明安装的是 JDK 17,但却返回了 Java 1.8 的信息,通常说明:

  • 目标服务器上同时安装了多个 Java 版本,且默认 java 指向的是 1.8

    • 很可能通过 which java 或 update-alternatives –config java 可以看到系统当前默认链接的是 Java 1.8。
    • JDK 17 也许安装在 /usr/local/java17 或其它路径,但并没被系统设置为默认。
  • 远程用户的环境变量 / PATH 没有生效

    • 有时在非交互式登录( 比如直接 ssh user@server "command" )时,不会加载某些配置文件(如 ~/.bash_profile 或 ~/.bashrc),导致 Java Home 或 PATH 未被正确设置。
    • 如果您只在交互式 Shell 里能看到 Java 17,那么说明配置只在交互式环境被加载,对于 SSH 的非交互命令,可能走了系统全局的默认 Java 1.8。
  • 您使用的远程用户名与配置不一致

    • 您本以为该用户下是 JDK 17,但实际上您 SSH 登录的用户权限或环境不一样(比如 root 账户默认为 Java 1.8)。

  • 如何排查

  • 检查目标服务器上的默认 java 路径

    ssh user@server "which java"
    ssh user@server "readlink -f $(which java)"

    • 这可查看究竟 /usr/bin/java 或 /usr/local/bin/java 最终指向哪个版本的 Java。
    • 若指向 /usr/lib/jvm/java-8 等目录,说明系统默认走的 1.8。
  • 查看系统的 alternatives 配置(如果是 Linux)

    ssh user@server "update-alternatives –display java"

    • 可能会列出多个候选版本和当前默认指向。也可以执行:ssh user@server "update-alternatives –config java"
    • 如果要切换默认版本,需要在服务器上执行此配置命令或修改相应链接。
  • 查看环境变量 JAVA_HOME 与 PATH

    • 在远程服务器上执行:ssh user@server "echo \\$JAVA_HOME; echo \\$PATH"
    • 看看这里有没有指向 JDK 17。如果没有,说明您需要在 .bashrc 或 .bash_profile、/etc/profile 等地方配置正确的变量。
  • 测试是否是交互式登录才加载

    • 如果您直接在远程服务器上登录,然后敲 java -version 看到 17,而通过 ssh "java -version" 却是 1.8,说明可能 .bashrc 或 .bash_profile 里某些配置仅在交互式 Shell 启用。
    • 可以尝试加 -t 参数强制交互式 Shell,或把相关环境配置移动到 /etc/profile 或 ~/.profile 里让非交互式 SSH 也能加载。

  • 结论

    • 1.8 从哪来? 绝大多数是目标服务器装了多个 Java 版本,系统默认 java 指向了 1.8。
    • 怎么手动验证? 先执行 ssh user@server "which java"、ssh user@server "readlink -f $(which java)"、update-alternatives –display java 逐项检查;再看远程用户的环境变量和系统全局的默认设置。
    • 怎么切换到 JDK 17?
      • 要么通过 update-alternatives –config java 选择 17 为默认;
      • 或者在非交互式环境也加载相应的 Java 环境变量 (JAVA_HOME + PATH);
      • 或直接在命令中用绝对路径调用 17 (/usr/local/java17/bin/java -version)。

    这样您就能查清为何 SSH 返回的是 Java 1.8,而非 17,并具体修正目标服务器上的默认 Java 设置。

    三、update-alternatives –config java 可以看到系统当前默认链接的是 Java 1.8。,为什么ssh -l 目标服务器 ’Java-version‘ 是默认的jdk吗?

    因为在通过 SSH 远程执行 java -version 时,系统默认调用的是当前“全局默认链接”的 Java,也就是通过 update-alternatives –config java 看到的那个版本。如果该默认链接指向的是 1.8,那远程执行自然会显示 Java 1.8。

    换句话说,服务器上可能装了多个 JDK,但您没有显式指定要用哪个 JDK,就会用系统里默认的 java,而这通常是由 update-alternatives 配置所决定。只要默认链接尚未切换到 JDK 17,那么远程执行就会显示 1.8。

    如果您想让远程执行使用 JDK 17,可以:

    • 通过 update-alternatives –config java 在系统层面将 JDK 17 选为默认;
    • 或者在命令里显式指定 JDK17 的绝对路径(例如 /usr/local/java17/bin/java -version);
    • 或者在用户环境变量(如 .bashrc、/etc/profile)里优先设置了 JDK17,但要确保非交互式 SSH 也能加载相应配置。这样就能使 ssh -l 目标服务器 "java -version" 显示 JDK 17。

    四、通过 update-alternatives –config java 在系统层面将 JDK 17 选为默认 具体怎么配置?

    可以通过以下步骤来切换系统默认的 Java 版本为 JDK 17(以 Linux 常见发行版为例):


    1. 确保系统已安装 JDK 17

    先确认 JDK 17 已正确安装在某个目录。例如:

    • /usr/lib/jvm/java-17/
    • /usr/local/java17/
    • 等其他目录

    若还未安装,可以通过发行版自带的包管理器或手动下载并解压安装。


    2. 注册到 update-alternatives

    如果安装后还没有注册到 update-alternatives,需要先执行(下面示例以 /usr/local/java17/ 为路径,需根据你实际目录修改):

    sudo update-alternatives –install /usr/bin/java java /usr/local/java17/bin/java 1
    sudo update-alternatives –install /usr/bin/javac javac /usr/local/java17/bin/javac 1

    解释:

    • update-alternatives –install 命令用于将某个可执行文件(如 java、javac)注册到系统的“备选列表”中;
    • /usr/bin/java 是系统标准可执行路径;
    • java 是该选项的名字;
    • /usr/local/java17/bin/java 是要注册的真正可执行文件路径;
    • 1 表示优先级(数字越大,优先级越高;若多个版本同级,则后面用命令手动切换)。

    如果系统已经有了 JDK 1.8 的可执行文件,比如 /usr/bin/java -> /usr/lib/jvm/java-8/bin/java,再添加上 JDK 17,即表示系统有两个 Java 选项可选。


    3. 切换默认版本

    然后执行:

    sudo update-alternatives –config java

    系统会显示类似:

    There are 2 choices for the alternative java (providing /usr/bin/java).

    Selection Path Priority Status
    ————————————————————
    * 0 /usr/lib/jvm/java-8/bin/java 1 auto mode
    1 /usr/lib/jvm/java-8/bin/java 1 manual mode
    2 /usr/local/java17/bin/java 1 manual mode

    Press <enter> to keep the current choice[*], or type selection number:

    此时输入数字选择 JDK 17 的那一项 ( 比如 2 ),再按回车。这样就在系统层面将“java”命令的默认链接切换成 JDK 17 了。

    如果你还需要 javac 也同样切换,执行:

    sudo update-alternatives –config javac

    并选择 JDK 17 的路径即可。


    4. 验证

    再次执行:

    java -version

    若显示 openjdk version "17" 或 java version "17",说明已成功切换默认版本到 JDK 17。


    小结

  • 先注册:sudo update-alternatives –install /usr/bin/java java /usr/local/java17/bin/java 1
  • 再切换:sudo update-alternatives –config java → 选 JDK 17。
  • 验证:java -version。
  • 这样当你通过 ssh user@server "java -version" 时,如果该用户的环境变量或 PATH 没有特殊改动,一般就会直接使用新的默认 Java 17,而不再显示 1.8。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 【云原生技术】 `ssh -l 目标服务器 ‘java -version‘`情况排查jdk版本问题
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!