Ubuntu 22.04下Java环境的搭建(含多版本一键快速切换)_ubantu22.04安装并配置java11环境-程序员宅基地

技术标签: java  ubuntu  linux  JAVA 基础  

0-1开始Java语言编程之路
一、Ubuntu下Java语言环境搭建
二、Ubuntu下Docker环境安装
三、使用Docker搭建本地Nexus Maven私有仓库
四、Ubuntu下使用VisualStudioCode进行Java开发

为什么需要多个版本的JAVA

在真正要安装多个版本的JDK之前,我们先想一个问题,为什么我们需要多个版本的JDK?
通常来讲,如果是生产环境的服务器,只会安装一个版本的Java运行时环境,因为我们在实际构建和部署我们的服务端应用时,只会基于某一个版本的JDK来构建和部署。例如,我们基于JDK8构建的应用,在部署的时候,对应的服务器上只需要Java 8 的运行时环境,因为我们也不会在一台服务器上部署两个不同的应用,而且还依耐不同的Java运行时环境。至于为什么是这样的,大家可以去理解一下面向对象的经典原则:单一职责原则,放以这里也同样适用。

我们这里所说的需要多个版本的Java,一般指的是我们在本地开发的时候,用于开发的电脑,通常是我们的台式机或者笔记本电脑需要安装不同版本的JDK。

我想大家进入一家公司,特别是一家成立若干年的公司,从公司创立起,到现在为此,从第一个Java服务,到现在最新开发的Java服务,大概率是基于不同的JDK版本开发的。那些在公司创立之初的系统,我们现在称之为legacy system。那么我们如果进入这样一家公司工作,大概率也会遇到要对这些legacy system 的代码进行维护的工作,这样新旧系统的开发和维护工作则很大概率需要我们在不同版本的JDK之间进行切换了。

Ubuntu下JDK安装的几种方式

方式一、通过APT 安装JDK

通过apt来安装JDK,目前只能用于安装Open-JDK,无法安装Oracle JDK,具体的安装方式如下:

sudo apt install openjdk-8-jdk

这条命令表示安装Open-JDK-8,其中openjdk-8-jdk 是需要安装的版本的名称,如果想要安装其它的版本,可以输入

sudo apt install openjdk- 

后,按**【tab】** 键,会展示更多的版本号,目前支持 8, 11, 17, 19, 21等版本。
在这里插入图片描述
通过apt install 的方式来安装Open-JDK,安装程序会将JDK安装至 /usr/lib/jvm/[xxxx]目录下边,大家可以自行查看。

方式二、参考Oracle 官方安装指引

首先下载对应版本的JDK安装文件,大家可以在下面的下载地址找寻自己想要安装的版本

Oracle JDK 下载
可以选择不同的版本,tar.gz 或者 .deb格式都可以。

下载tar.gz文件,手工安装

默认情况下,Ubuntu系统自带的jdk是安装在/usr/lib/jvm/目录底下,所以按照惯例,我们先将.tar.gz 文件移动到 /usr/lib/jvm/目录下边,再进行安装,参考如下命令:

sudo mv ~/下载/jdk-17_linux-x64_bin.tar.gz /usr/lib/jvm
cd /usr/lib/jvm
sudo tar zxvf jdk-22_linux-x64_bin.tar.gz

下载.deb 文件,通过dpkg安装

同理,如果下载的是.deb文件(因为Ubuntu是源于Debian的),则执行如下命令:

sudo dpkg -i jdk-22_linux-x64_bin.deb

同样的,该命令会将JDK安装至/usr/lib/jvm/jdk-22目录底下

方式三、~~(该方式已失效仅供参考)~~通过第三方PPA源方式安装OracleJDK

首先我们需要指定一个apt 源,但该源目前已经终止了

sudo add-apt-repository ppa:webupd8team/java
sudo apt update

大家可以自行尝试一下,看是不是同样的结果,大致意思就是2019年4月16号以后,要下载Oracle JDK,都必须登录Oracle账号,且OracleJDK最新的license协议表明Oracke JDK只能免费用于个人或开发使用。所以PPA源已经终止,不再提供服务了。

源: ‘deb https://ppa.launchpadcontent.net/webupd8team/java/ubuntu/ jammy main’
描述:
The Oracle JDK License has changed for releases starting April 16, 2019.
The new Oracle Technology Network License Agreement for Oracle Java SE is substantially different from prior Oracle JDK licenses. The new license permits certain uses, such as personal use and development use, at no cost – but other uses authorized under prior Oracle JDK licenses may no longer be available. Please review the terms carefully before downloading and using this product. An FAQ is available here: https://www.oracle.com/technetwork/java/javase/overview/oracle-jdk-faqs.html
Oracle Java downloads now require logging in to an Oracle account to download Java updates, like the latest Oracle Java 8u211 / Java SE 8u212. Because of this I cannot update the PPA with the latest Java (and the old links were broken by Oracle).
For this reason, THIS PPA IS DISCONTINUED.
UPDATE:
For Oracle Java 17, see a different PPA -> https://www.linuxuprising.com/2021/09/how-to-install-oracle-java-17-lts-on.html
Old description:
Oracle Java (JDK) Installer (automatically downloads and installs Oracle JDK8). There are no actual Java files in this PPA.
Important -> Why Oracle Java 7 And 6 Installers No Longer Work: http://www.webupd8.org/2017/06/why-oracle-java-7-and-6-installers-no.html
Update: Oracle Java 9 has reached end of life: http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html
The PPA supports Ubuntu 18.10, 18.04, 16.04, 14.04 and 12.04.
More info (and Ubuntu installation instructions):- http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html
Debian installation instructions:
-Oracle Java 8: http://www.webupd8.org/2014/03/how-to-install-oracle-java-8-in-debian.html更多信息:https://launchpad.net/~webupd8team/+archive/ubuntu/java
正在添加源。
按 [ENTER] 继续,或按 Ctrl-c 取消。

JAVA 环境的配置

上面已经提到了Ubuntu下JDK的几种不同安装方式,大家选择其一就好了。

在安装完JDK后,还需要进行JAVA环境的配置,不管是Linux也好,还是Windows也好,或者Mac OS也好,其实都会通过系统环境变量的方式来进行配置
有三个基本的环境变量需要我们进行配置

  • JAVA_HOME
  • JRE_HOME
  • CLASSPATH
    另外,我们也需要将$JAVA_HOME/bin目录加入至PATH环境变量中。

通常来讲,在Ubuntu下比较推荐的一种方式是修改/etc/environment文件,在该文件中加入如下内容:

JAVA_HOME="/usr/lib/jvm/jdk-17-oracle-x64"
JRE_HOME=${JAVA_HOME}/jre
CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib


修改完 environment 文件后,需要使该配置生效

source /etc/environment

那么到目前为止,一个JDK版本的安装和配置就结束了。

那如果需要安装多个应该怎么办,实际上安装过程是一样的,只是在安装完后,我们需要手工修改一下环境变量的配置,以及使用update-alternatives命令来切换java的版本。

sudo update-alternatives --config java
sudo update-alternatives --config javac

这里只是列举了 java 和 javac 这两个java 命令,其它的工具包也可以通过此方式来进行版本的切换。

如何实现版本间的快速切换

那么问题来了,如果每一次切换,都需要手工修改环境变量,需要通过 update-alternatives --config来切换版本,想想也是很繁琐和麻烦的。
有没有更好的方式?
Y E S,当然是有的

这里我们需要结合一个java版本管理工具,jenv,以及简单的 shell 脚本来实现快速的切换。

  • jenv 负责Java版本的切换
  • 自定义shell 脚本负责环境变量的修改

因为有一些工具或者应用,会依赖JAVA_HOME环境变量来确定当前的JDK版本,比如:Visual Studio Code。
只所以需要自定义shell脚本,是因为jenv不负责环境变量的修改。

jenv 的安装和使用

第一步:下载jenv

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

第二步:将jenv加入PATH,并初始化。编辑~/.bashrc


#大家注意,这里只是临时这样操作,只是用于检测jenv是否安装好
#最后 .bashrc 文件还需要进行调整
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(jenv init -)"' >> ~/.bashrc
source ~/.bashrc

第三步:将已经安装好的各个版本的JDK本添加到jenv版本管理工具中。

jenv add /usr/lib/jvm/jdk-17-oracle-x64
jenv add /usr/lib/jvk/other-jdk-version

第四步:查看或切换版本

#查看已添加的JDK版本
jenv versions

#设置全局JDK版本
jenv global <jdk_version>

#仅设置当前目录的JDK版本
jenv local <jdk_version>

快速调整环境变量

第一步:创建一个目录用于保存配置文件和shell脚本

mkdir ~/jdk_env

第二步:准备各个JDK版本的环境变量配置文件,命名格式为:env_ora_jdk_version

JAVA_HOME="/usr/lib/jvm/jdk-17-oracle-x64"
JRE_HOME=${JAVA_HOME}/jre
CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

第三步:创建切换版本的shell脚本,简单起见,每一个JDK版本搭配一个shell脚本,命名为:env_4_jdk_17.sh

#!/bin/bash

echo Change JAVA_HOME Environment to Oracle JDK 17
sudo cp ~/jdk_env/env_ora_jdk_17 /etc/environment

#设置一个修改标识,.bashrc中会读取该修改标识
export ENV_CHANGE=1
source ~/.bashrc

#请注意版本号,可通过jenv versions查看
jenv global oracle64-17.0.9
java -version
echo JAVA_HOME : $JAVA_HOME
echo Change Environment Done!

第四步:编辑 ~/.bashrc 文件,在增加 alias

#第一部分:增加alias,快捷命令
alias jdk8='source ~/jdk_env/env_4_jdk_8.sh'
alias jdk17='source ~/jdk_env/env_4_jdk_17.sh'
alias jdk21='source ~/jdk_env/env_4_jdk_21.sh'


#第二部分:在.bashrc文件末尾增加以下内容

#这里是先配置默认PATH
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

#检查JRE_HOME的值是否已经设置好,如果未设置好,则读取一下配置
if [ "$JRE_HOME" = '${JAVA_HOME}/jre' -o "$ENV_CHANGE" = '1' ]; then
    source /etc/environment
    export ENV_CHANGE=0
fi

#增加jenv 以及 java home到 PATH
export PATH="$HOME/.jenv/bin:$JAVA_HOME/bin:$PATH"
eval "$(jenv init -)"

#执行完 上有条   eval "$(jenv init -)" 后,JAVA_HOME 会失效,需要重要加载一下JAVA环境变量
if [ -z "$JAVA_HOME" ]; then
    source /etc/environment
fi

测试JDK 切换

source ~/.bashrc

jdk21

那么,本文到这里就已经结束,如果你的开发环境需要在不同JDK版本之间进行切换,希望本文能帮助到你,为你提升那么一丢丢的效率,实现一键切换JDK版本。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011278722/article/details/137354015

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签