macOS 中 Java 版本管理的好帮手 jEnv

困恼

在开发的时候每个人配置 Java 环境都不一样, 或者开发者都有多个版本的 jdk,比如:

1
2
3
4
5
6
7
8
9
10
11
12
# 当前版本
➜ ~ java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

# 所有的版本
➜ ~ ll /Library/Java/JavaVirtualMachines
total 0
drwxr-xr-x 3 root wheel 102B 6 3 2017 jdk1.7.0_80.jdk
drwxr-xr-x 3 root wheel 102B 4 12 2017 jdk1.8.0_121.jdk
➜ ~

jEnv 介绍

Java 生态中包含大量的你可能想使用的工具,包括 Java 本身到一些构建工具,如 Maven 和 Gradle,以及第三方应用如 ActiveMQ 和 Tomcat 等。经常你会需要同时使用这些工具的不同版本,用于不同的项目,或者想对一个项目在不同版本的环境中做兼容性测试。

管理这些不同版本的工具是一项非常复杂的任务。每个工具有各自不同的获取方式,如果安装,如何控制都是很成问题的。

值得庆幸的是,jenv 可以帮你轻松搞定这个复杂的工作(请注意该工具不同于 jEnv, 这是用来设置 JAVA_HOME 环境变量的)。jenv 支持 Windows、Mac 和 Linux – 可以轻松管理大量基于 Java 开发的工具的多个版本。目前已经支持超过 200 个不同的工具。

jEnv 安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
➜  ~ brew install jenv
# bash
$ echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(jenv init -)"' >> ~/.bash_profile
# zsh
$ echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(jenv init -)"' >> ~/.zshrc

# 查看版本
➜ ~ jenv versions
* system (set by /Users/niuhesm/.jenv/version)
➜ ~ bash
bash-3.2$ jenv versions
* system (set by /Users/niuhesm/.jenv/version)
bash-3.2$ zsh
➜ ~ open ~/.bash_profile

它只找到了系统默认的Java,即使我已经下载了其他版本的Java。*表示当前选择的版本。

添加 Java 版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
➜  ~ jenv add /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/
oracle64-1.7.0.80 added
1.7.0.80 added
1.7 added
➜ ~ jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/
oracle64-1.8.0.121 added
1.8.0.121 added
1.8 added

# 重新查看版本
➜ ~ jenv versions
* system (set by /Users/niuhesm/.jenv/version)
1.7
1.7.0.80
1.8
1.8.0.121
oracle64-1.7.0.80
oracle64-1.8.0.121

# 只保留一个版本
➜ ~ ....
➜ ~ jenv remove oracle64-1.7.0.80
JDK oracle64-1.7.0.80 removed
➜ ~ jenv remove oracle64-1.8.0.121
JDK oracle64-1.8.0.121 removed
➜ ~ jenv versions
* system (set by /Users/niuhesm/.jenv/version)
1.7.0.80
1.8.0.121
➜ ~

# 指定版本
➜ ~ java -version
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
➜ ~ jenv local 1.8.0.121 # 指定当前的运行版本
➜ ~ java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
➜ ~ jenv which java # 显示可执行的Java的完整路径
/Users/niuhesm/.jenv/versions/1.8.0.121/bin/java
➜ ~

这当然不是真实的路径,而是一个硬链接。你可以找到 /Users/kmyhy/.jenv/versions/ 目录,发现所有的 java 版本都被列在了这里,这些硬链接(相当于 windows 的快捷方式)都指向了对应的 java 安装目录。
你还可以指定一个全局的版本

1
➜  ~ jenv global 1.7.0_80

这样,默认的 java 版本就是 1.7.0_80 了。如果你想在某个项目中使用 1.7.0_80 版本,可以在项目文件夹下新建一个.java-version 文件,将文件内容编辑为 1.7.0_80 保存。这样,你进入这个文件夹时 jenv 会自动使用 1.7.0_80 作为当前版本(即 local 版本)。