Java技术栈 —— Ubuntu下安装Java


我们的目标是,在Ubuntu下安装各个jdk版本,并在将来的开发过程中能够做到灵活切换。不管之前对Java的了解有多深,这里也还是重新做一次梳理。

一、剪不断理还乱的JDK

1.1 JDK、JRE、JVM的关系

简明扼要的说,JVM ∈ \in JRE ∈ \in JDK,关系从左到右依次是,JVM包含于JRE中,JRE包含于JDK中,更详细的内容见:【 Differences between JDK, JRE and JVM 】

1.2 JavaSE、JavaEE和JDK的关系

Java SE(Java Platform, Standard Edition),一些核心类如java.lang,java.io包,只要你在JDK下看到的,都属于Java SE。
Java EE(Java Platform, Enterprise Edition,现已更名为Jakarta EE),用来开发企业级应用程序的,在Java SE的基础上构建的,具体的Java EE特性是要由具体程序组件来提供的,比如Tomcat,我还记得我大学上的Java实训课就叫Java EE实训。
所以,下载到的JDK都是符合Java SE的,也根本没有所谓的Java EE的JDK,详细内容见这四篇文章:

1.2 参考文章或视频链接
[1] 【Differences between Java EE and Java SE】
[2] 【JDK = Java SE && JDK != Java EE?】
[3] 【Java EE and JDK】
[4] 【java ee , java se, java me 怎么区分? - 黑马程序员Java的回答 - 知乎】

1.3 OpenJDK和OracleJDK的关系是什么?选哪个JDK?

在Java开发的过程中,我接触过OpenJDK和OracleJDK这两种说法,因此需要弄清楚这两个JDK的关系:OracleJDK由Oracle公司开发与维护,OpenJDK由Oracle、RedHat及其他组织维护,二者差别很小。详细内容见下面5篇参考文章。如果忽略场景和前缀,只提JDK,一般指Oracle JDK,收钱的嘛,都是冠以Oracle名字的亲儿子了。没什么特殊需要,选择OpenJDK就满足需求了。

1.3 参考文章或视频链接
[1] 【JDK与OpenJDK区别(简略通俗易懂)】
[2] OpenJDK versus Oracle JDK
[3] Oracle JDK和 OpenJDK 之间的区别
[4] 我来告诉你 Oracle JDK 与 OpenJDK 之间到底有什么区别
[5] 7 reasons to switch from Oracle JDK to OpenJDK

1.4 JDK有多少发行版?

事实上,JDK不止OpenJDK和OracleJDK有这两个JDK发行版,就像Linux不只有一个发行版操作系统,而较为常见的就这两种,所以单独拎出来说,想了解更多JDK发行版的详细内容,请看这篇文章:【 Which Version of JDK Should I Use? 】

JDK 发行版备注
OpenJDK常用,免费
OracleJDK常用,收费
Adoptium Eclipse Temurin-
AdoptOpenJDK弃用,此项目已变更为Adoptium Eclipse Temurin
Azul ZuluAzul Offical Website
Azul Zing-
BellSoft Liberica JDK免费,Spring Boot框架选用此JDK作为其构建包的运行时依赖,见Spring官网:Spring Quickstart Guide 与BellSoft官网“自卖自夸
IBM Semeru Runtime比较冷门,只有在明确你需要OpenJ9这个JVM时使用此JDK
Amazon Corretto(Corretto是一种意大利咖啡)如果你在亚马逊云上的Amazon Linux 2服务器上运行Java程序,这个JDK会是一个好的选项
Microsoft Build of OpenJDK文章推荐只在微软云上使用此JDK
Alibaba Dragonwell见名知义,这是阿里的产品,可文中居然说,如果不是被zf强迫使用,不要用这个JDK发行版,我想,这里的zf对写这篇文章的人而言,应该指国外的zf,由此可见,有些外国人对我们国家的敌意
SapMachine由思爱普公司(SAP)维护的一个JDK发行版
Red Hat OpenJDK由RedHat组织维护的一个JDK发行版
GraalVMOracle基于OpenJDK开发的,有更高性能的编译器,与一个可以执行不同语言所编写的代码的虚拟机

想了想,Oracle的这种做法符合商业逻辑:先主打免费好用,培养出市场,然后顺势建立垄断地位,最后盯着大公司收割且只盯着大公司,小公司作为商业生态的底层,是可持续性竭泽而渔的一部分,法律上睁一只眼闭一只眼。
一开始Java的技术特性主要解决的痛点就是“一次编译,到处运行”,等到人们都喜欢上了Java的好处,Oracle财大气粗的把它收购到自己门下,然后JDK摇身一变,推出一个收费的OracleJDK,所有吸收了这杯咖啡香气的人都要给他交一笔钱,之后,王侯将相,宁有种乎,烽烟四起,各种基于OpenJDK的JDK发行版开始群雄逐鹿,虽然Oracle与其他的一些组织也有在维护这个OpenJDK,但我想,从商业角度上来说,Oracle不能也不会将OpenJDK封死,这无疑是在给Java掘坟。
【Java licensing changes in 2023 (updated)】

二、如何在Ubuntu下安装JDK并灵活切换

明确目标:在Ubuntu下安装各个jdk版本,并在将来的开发过程中能够做到灵活切换。使用以下命令,安装JDK8,JDK11,JDK17

sudo apt install openjdk-8-jdk
sudo apt install openjdk-11-jdk
sudo apt install openjdk-17-jdk

按照上面的顺序安装完,然后执行下java -version,看到的应该JDK17,我们还有另外两个包,要做到灵活切换,如何切换呢?

root@programmer-ubuntu:/# java -version
openjdk version "17.0.8.1" 2023-08-24
OpenJDK Runtime Environment (build 17.0.8.1+1-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 17.0.8.1+1-Ubuntu-0ubuntu122.04, mixed mode, sharing)

来到根目录/下,让我们用find / -name java找下这些包的安装目录。

root@programmer-ubuntu:/# find / -name java
/usr/lib/jvm/java-8-openjdk-amd64/bin/java
/usr/lib/jvm/java-11-openjdk-amd64/bin/java
/usr/lib/jvm/java-17-openjdk-amd64/bin/java

找到目录后,我们先执行which javals -lsa /usr/bin/javals -lsa /etc/alternatives/java分别得到以下结果,这就不奇怪了,原来最终指向的是JDK17的安装内容。

root@programmer-ubuntu:/# which java
/usr/bin/java
root@programmer-ubuntu:/# ls -lsa /usr/bin/java
0 lrwxrwxrwx 1 root root 22 1012 20:12 /usr/bin/java -> /etc/alternatives/java
root@programmer-ubuntu:/# ls -lsa /etc/alternatives/java
0 lrwxrwxrwx 1 root root 43 1012 20:13 /etc/alternatives/java -> /usr/lib/jvm/java-17-openjdk-amd64/bin/java

我们尝试加入JDK8与JDK11,让Ubuntu知道,Java还可以调整至这两个版本

#我的JDK8的java程序安装路径:/usr/lib/jvm/java-8-openjdk-amd64/bin/java,根据刚刚find / -name java搜到的来
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-8-openjdk-amd64/bin/java 100
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-11-openjdk-amd64/bin/java 100

然后用sudo update-alternatives --config java,选择我们要的JDK版本即可:

root@programmer-ubuntu:/# sudo update-alternatives --config java
There are 4 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-17-openjdk-amd64/bin/java      1711      auto mode
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      100       manual mode
  2            /usr/lib/jvm/java-17-openjdk-amd64/bin/java      1711      manual mode
  3            /usr/lib/jvm/java-8-openjdk-amd64/bin/java       100       manual mode
  4            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode

Press <enter> to keep the current choice[*], or type selection number: 3
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/java to provide /usr/bin/java (java) in manual mode

再执行java -version,就是JDK8了,JDK11同理,选择你想要的即可

root@programmer-ubuntu:/# java -version
openjdk version "1.8.0_382"
OpenJDK Runtime Environment (build 1.8.0_382-8u382-ga-1~22.04.1-b05)
OpenJDK 64-Bit Server VM (build 25.382-b05, mixed mode)

最后,我们还是要像Windows那样,添加下环境变量,有些软件或者框架就靠这个去找Java装在哪

sudo vim /etc/environment

在最后一行,添加确定版本的JAVA_HOME

#这一行是文件原本就有的
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/

执行命令,立即生效,并查看结果,关闭终端再重新登录Ubuntu即永久起效

root@programmer-ubuntu:/# source /etc/environment
root@programmer-ubuntu:/# echo $JAVA_HOME
/usr/lib/jvm/java-11-openjdk-amd64
二、参考文章或视频链接
[1] 【How to install Java JDK on Ubuntu】
[2] 【The Purpose of /etc/alternatives in Linux: Explained】
[3] 【What is etc/alternatives used for?】
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值