🙀Java 又双叒叕发布新版本,这么多版本如何灵活管理?

本贴最后更新于 1852 天前,其中的信息可能已经东海扬尘

前言

不知不觉 JDK13 发布已有两个月,不知道各位有没有下载学习体验一番?每次下载安装之后,需要重新配置一下 Java 环境变量。等到运行平时的项目又需要切回之前 JDK 版本,这又需要重新环境变量。这么重复配置显然非常低效,又不能灵活切换版本。

所幸通过万能 Google 找到解决方案,使用 jenv 管理 JDK 版本。

jenv 介绍

熟悉 Ruby 的同学,应该会觉得比较眼熟,jenv 就是 Java 平台的 rbenv 工具。

jenv 是一个命令行工具,可以在 Linux/OS X 平台使用,可以管理多个版本 JDK,方便在多个版本 JDK 之间切换,另外其还可以设置 JAVA_HOME 环境变量。

Windows 真的伤不起 😭

使用 jenv 有一个前提,必须提前安装 JDK,其不提供下载安装 JDK 的功能。MacOSX 平台可以提前使用 brew 安装 JDK。

jenv 安装

手动安装

首先下载 jenv 源程序

git clone https://github.com/jenv/jenv.git ~/.jenv

然后再将 jenv 命令路径放入 Shell 配置文件中。

若使用 Shell 为 bash

echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile   
echo 'eval "$(jenv init -)"' >> ~/.bash_profile
source ~/.bash_profile

若使用 Shell 为 zsh

echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc  
echo 'eval "$(jenv init -)"' >> ~/.zshrc
source ~/.zshrc

自动安装

若使用 MacOSX,可以直接使用 brew 安装:

brew install jenv

jenv 校验

安装 jenv 之后,可以运行 jenv doctor 检查是否正确安装。以下为我本机 MacOSX 输出:

刚安装小伙伴运行 jenv doctor ,可以观察到输出:

[ERROR]	Java binary in path is not in the jenv shims.

这代表还未正确添加 JDK,需要运行下面指令添加 JDK。

jenv 配置

JDK 配置

运行 jenv add jdk_path,将 JDK 交给 jenv 管理。

可能有些小伙伴并不知道 JDK 安装路径,若是 MacOSX,JDK 是通过 Oracle 提供安装包或者通过 brew 安装,可以通过运行 /usr/libexec/java_home -V 查找 JDK 路径。

若不是通过以上方式,或者为 Linux 平台,可以先通过 which java 或者 whereis java 找出命令路径。然后通过使用 ls -l 查看命名的实际路径。

JAVA_HOME 配置

有些应用程序将会读取系统 ${JAVA_HOME} 环境变量,通过安装 jenv 插件,切换 JDK 版本时,将会同步设置 ${JAVA_HOME} 变量。

jenv enable-plugin export
## 运行这个才会生效
exec $SHELL -l

jenv 使用教程

jenv versions

查看当前系统 jenv 管理所有 JDK 版本。

jenv versions

jenv local

通过上面命令,我们知道当前系统所有 JDK 版本之后,通过下面命令切换 JDK 版本。

JDK 版本切换 JDK1.7

jenv local 1.7

这里需要注意的,jenv local 切换 JDK 版本只对当前文件夹有效,如果切换到其他文件夹,将会切换会当前默认 JDK 版本。

jenv shell

使用 jenv shell 使切换的 JDK 版本对整个 Shell session 有效。重启 Shell 终端或重新打开新的 Shell 终端,该配置失效。

jenv shell 9.0

jenv global

jenv global 将会设置一个全局默认的 JDK 版本,即使重启 Shell 窗口,该配置也不会改变。

jenv global 9.0

jenv 小问题

上面几个是 jenv 经常使用的指令,若想了解 jenv 其他指令,可以通过 jenv commands 查找其他指令。

使用 jenv 过程可能会发现,当切换 JDK 版本之后, ${JAVA_HOME} 环境变量没有改变,还是上一个 JDK 版本配置。

这时可以运行 exec $SHELL -l${JAVA_HOME} 将会变成当前版本。

最后

做个小调查,你还在用那个版本 JDK?各位小伙伴可以留言一下,嘿嘿~

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3190 引用 • 8214 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • hjljy

    话说 JDK9 不收费么?

  • yangyujiao

    公司最老的一个项目还在用 6 ,有一个用 7

  • 用 7 就完了,管理个毛.

    1 回复
  • Java 开发对版本并不怎么敏感

  • 开始从 8 转 11,就是 8->9 难转,思维模式有点不适应,新特性还是很好用的,各种语法糖。所以我们还是用 kotlin 把!😄 (逃 ~

  • ZephyrJung

    电脑里如果 java 版本不多的话其实一个命令行就可以切换

  • Ever

    个人用 jdk11 和最新版本的 spring 全家桶,公司用 java8 和最新的 spring 全家桶。

  • Aftery

    个人喜欢 sdkman,以前 jenv 好用,换了作者之后感觉使用很麻烦

  • 614756773

    现在公司使用,主流是 7,8 吧

  • Evagnlist

    公司老项目(3 年以上历史)都是 J6,新项目都是 J8,后面的 java 版本,感觉大家都没有兴趣去学习使用

  • someone
    作者

    sdkman 这个可以一键安装 JDK 确实方便

  • someone
    作者

    个人用其实都没事的

  • someone
    作者

    老项目切换 JDK 有风险。我们之前一把切,有些老项目依赖 jar 只能在 JDK 6 以下启动。。。。。

  • wizardforcel

    没有 Lambda 还玩个毛线。

    其实 Java 新特性里面的库都有替代品,但是语法层面真是没辙。就算你用最新的版本,还没有类型别名和 dataclass 这种东西。

  • wizardforcel

    为啥就不能像 Python 那样,python2python3python35python36py 用于切换 python 命令的版本。

请输入回帖内容 ...