本文由 简悦SimpRead 转码,原文地址 reflectoring.io
作为Java开发者,我们经常需要为不同的项目在不同的JDK版本之间切换......。
作为开发人员,我们经常同时在不同的代码库上工作。特别是在有微服务的环境中,我们可能每天都要多次切换代码库。
在每隔几年就发布一个新的Java版本的时代,这往往不是问题,因为大多数代码库需要相同的Java版本。
当Java的发布周期变为每6个月时,这种情况就改变了。今天,如果我们在多个代码库上工作,有可能每个代码库都在使用不同的Java版本。
jEnv是一个帮助我们管理多个JDK安装的工具,并将每个代码库配置为使用特定的JDK版本,而不必改变JAVA_HOME
环境变量。
请务必查看关于SDKMAN的文章!,这是一个用于管理JDK(和其他工具)的替代工具。
安装jEnv
jEnv支持Linux和MacOS操作系统。如果你使用的是Windows,你需要安装Windows Subsystem for Linux(或像GitBash这样的bash模拟器)来使用它。
按照jEnv主页上的安装说明来安装jEnv。
安装JDK
如果你正在阅读这篇文章,你有可能想为你正在进行的代码库设置一个新的JDK。让我们从AdoptOpenJDK网站下载一个JDK。
选择你想要的版本并下载它。将.tar.gz
文件解压到你想要的地方。
jEnv的好处是,我们不需要通过brew、yum或apt等包管理器来安装JDK。我们只需下载一个JDK,并把它放到某个文件夹中。
你仍然可以使用brew、yum或apt来安装你的JDK,你只需要在事后找出你的包管理器把JDK放在哪个文件夹里。
向jEnv添加JDK
为了在jEnv中使用新的JDK,我们需要告诉jEnv在哪里可以找到它。让我们先用jenv versions
命令检查jEnv已经知道的JDK的哪些版本。
* system (set by /home/tom/.jenv/version)
11
11.0
11.0.8
13
13.0
13.0.2
14
14.0
14.0.2
openjdk64-11.0.8
openjdk64-13.0.2
openjdk64-14.0.2
复制代码
在我的例子中,我已经安装了JDKs 11、13和14。每个版本都有三个不同的名字。
假设我们已经下载了JDK 15,并将其解压到~/software/java/jdk-15+36
文件夹中。
现在,我们将新的JDK添加到jEnv中。
jenv add /home/tom/software/java/jdk-15+36/
复制代码
如果我们再次运行jenv versions
,我们会得到以下输出。
11
11.0
11.0.8
13
13.0
13.0.2
14
14.0
14.0.2
15
openjdk64-11.0.8
openjdk64-13.0.2
openjdk64-14.0.2
openjdk64-15
复制代码
JDK 15 已被添加到 15
和 openjdk64-15
的名称下。
本地 JDK 与全局 JDK
jEnv支持一个全局JDK和多个本地JDK的概念。
全局JDK是指如果我们在计算机上任何地方的命令行中输入java
,就会使用的JDK。
本地JDK是指只为某个特定文件夹配置的JDK。如果我们在这个文件夹的命令行中输入java
,它将不使用全局的JDK,而是使用本地的JDK。
我们可以用它来为不同的项目配置不同的JDK(只要它们生活在不同的文件夹里)。
设置全局JDK
首先,我们检查全局JDK的版本。
jenv global
复制代码
在我的例子中,输出结果是。
system
复制代码
这意味着系统安装的JDK将被作为全局JDK使用。system
这个名字不是很有帮助,因为它没有说明是哪个版本。让我们把全局JDK改成一个更有意义的、有版本号的JDK。
jenv global 11
复制代码
这个命令将全局使用的JDK版本改为11。在我的例子中,这与之前的版本相同,但如果我输入jenv global
,我现在会看到哪个JDK版本是我的全局版本。
设置本地JDK
还记得我们已经下载的JDK 15吗?我们下载它的原因可能是我们正在做一个新项目,需要JDK 15来运行。
假设这个项目位于~/shiny-project
文件夹下。让我们cd
进入这个文件夹。
如果我现在输入java -version
,会得到以下结果。
openjdk version "11.0.8" 2020-07-14
OpenJDK Runtime Environment (build 11.0.8+10-post-Ubuntu-0ubuntu118.04.1)
OpenJDK 64-Bit Server VM (build 11.0.8+10-post-Ubuntu-0ubuntu118.04.1, mixed mode, sharing)
复制代码
这是因为JDK 11是我的全局JDK。
让我们为这个项目把它改为JDK 15。
jenv local 15
复制代码
现在,再次输入java -version
,输出结果将是。
openjdk version "15" 2020-09-15
OpenJDK Runtime Environment AdoptOpenJDK (build 15+36)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 15+36, mixed mode, sharing)
复制代码
在这个文件夹中调用java
现在将总是调用Java 15而不是Java 11。
这是怎么做到的?
使用jenv local
命令后,你会在当前文件夹中发现一个名为.java-version
的文件。该文件包含本地JDK的版本号。
在安装过程中,jEnv会覆盖java
命令。每次我们现在调用java
,jEnv都会寻找.java-version
文件,如果找到了,就启动该文件中定义的JDK版本。如果它没有找到.java-version
文件,就会启动全局配置的JDK。
与Maven和Gradle合作
因此,如果我们通过命令行调用java
,它现在会接收一个本地配置的JDK。很好!但Maven或Gradle等工具
但像Maven或Gradle这样的工具仍然使用系统版本的JDK!
让我们来看看我们能做些什么。
配置jEnv使其与Maven协同工作
让Maven与jEnv定义的本地JDK协同工作很容易。我们只需安装maven
插件。
jenv enable-plugin maven
如果我们现在在上面的~/shiny-project
文件夹中运行mvn -version
,就会得到以下输出。
Maven home: .../apache-maven-3.6.3
Java version: 15, vendor: AdoptOpenJDK, runtime: /home/tom/software/java/jdk-15+36
Default locale: en_AU, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-52-generic", arch: "amd64", family: "unix"
复制代码
Maven现在正在使用新的JDK 15。耶!
配置jEnv使其与Gradle一起工作
在我的例子中,Gradle自动接收了jEnv在本地配置的JDK!。
如果你不能开箱工作,你可以按照上面Maven插件的方式安装gradle插件。
jenv enable-plugin gradle
复制代码
如果我们现在在上面的~/shiny-project
文件夹中运行gradle -version
,我们会得到以下输出。
------------------------------------------------------------
Gradle 6.5
------------------------------------------------------------
Build time: 2020-06-02 20:46:21 UTC
Revision: a27f41e4ae5e8a41ab9b19f8dd6d86d7b384dad4
Kotlin: 1.3.72
Groovy: 2.5.11
Ant: Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM: 15 (AdoptOpenJDK 15+36)
OS: Linux 5.4.0-52-generic amd64
复制代码
结论
jEnv是一个方便的工具,用于管理不同项目之间的多个JDK版本。通过jenv local <version>
,我们可以配置一个JDK版本,在当前文件夹中使用。