关于JVM、JRE与JDK
1. JVM(Java Virtual Mechinal)
Java虚拟机,是整个java实现跨平台的最核心的部分,负责解释执行字节码文件,是可运行java字节码文件的虚拟计算机。当使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码只面向JVM。不同平台的JVM都是不同的,但它们都提供了相同的接口。只要为不同平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行。
2. JRE: Java Runtime Environment
java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,普通用户而只需要安装 JRE来运行 Java 程序。
3. JDK:Java Development Kit
java开发工具包,是使用java语言编写java程序所需的开发工具包。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。
4. 区别与联系
- JDK 用于开发,JRE 用于运行java程序 ;如果只是运行Java程序,可以只安装JRE,无序安装JDK。
- JDk包含JRE,JDK 和 JRE 中都包含 JVM。
- JVM 是 java 编程语言的核心并且具有平台独立性。
关于JDK发行版本
Java由SUN公司(Sun Microsystems, 发起于美国斯坦福大学, SUN是Stanford University Network的缩写)发明, 2006年SUN公司将Java开源, 此时的JDK即为OpenJDK。
就源代码而言,只有一套Java源代码,存在OpenJDK项目中。但只是源代码,不是发布版本。理论上,任何人都可以从源代码构建一个版本然后发布,但是这个发行版缺少认证,不能对外号称与Java SE兼容。
所以一些企业、社区等供应商会自己构建、进行认证,然后发布,特别关注,Linux操作系统发行商一般都会提供内置JDK发行版本(软件源支持,并没有直接默认安装)。
常见JDK发行版本包括OracleJDK,OracleOpenJDK,AdoptOpenJDK,RedHatOpenJDK,Alibaba Dragonwell,Azul Zulu,Amazon Corretto等,供应商可以添加商标或者他们认为有用的其他实用程序。
根据普遍使用场景,本文介绍OracleJDK,OracleOpenJDK,AdoptOpenJDK,其他版本请自行了解。
1. OracleOpenJDK
OpenJDK是Java SE的开源实现, 它由SUN和Java社区提供支持, 2009年Oracle收购了Sun公司, 自此Java的维护方之一的SUN也变成了Oracle。
- OpenJDK采用GPL V2协议放出,允许商用。
- OpenJDK不能使用Java商标,在Sun被Oracle收购以后,Java这个商标就归Oracle所有了,OpenJDK执行“java -version”时显示OpenJDK,不会显示Java。
- OpenJDK不包含Deployment(部署)功能:部署的功能包括:Browser Plugin、Java Web Start、以及Java控制面板。
- OpenJDK源代码不完整,在采用GPL协议的OpenJDK中,sun jdk的一部分源代码因为产权的问题无法开放OpenJDK使用,其中最主要的部份就是JMX中的可选元件SNMP部份的代码,该部分功能可以通过插件形式补充。
- OracleOpenJDK由Oracle定期发布,但新版本发布后,不再维护旧版本。
2. OracleJDK
Oracle收购SUN以后,构建并发布OracleJDK,即大家普遍熟悉的JDK,也是生产环境使用最多的JDK发行版本,拥有Java完整功能,以及OpenJDK没有的一些商用特性,同时,Oracle定期发布OracleJDK,但也会产期维护LTS的旧版本(目前Java SE 7,8,11,17,21为LTS版本),所以功能性、稳定性、安全性要高于OpenJDK。不过,作为OpenJDK社区的主导者,Oracle也在尽量减少OpenJDK和Oracle JDK的差别(source),将一些商业特性移植到了OpenJDK上,比如Java Flight Recorder,Java Mission Control和ZGC等。
对于普通开发者,两者差异可忽略不计。
2019年4月16日以及之前发布的 OracleJDK 授权许可协议是BCL协议,即Oracle Binary Code License Agreement,协议规定我们可以使用JDK,但是不能进行修改。私用和商用都可以。
2019年4月16日,Oracle发布了新的JDK 8的更新,版本号为8u211和8u212。与以往不同的是,新版本的许可协议从BCL换成了OTN,即Oracle Technology Network License Agreement,目前新发布的JDK用的都是这个协议,可以私用以及研发用,商用需要付费,这就意味着,我们不能在生产环境使用这个版本了。所以,OracleJDK最后的免费版本为2019年1月15日发布的Oracle JDK 8u201和8u202。
特别关注:关于OracleJDK每次发布2个版本号,请参照附录
下图表示两种许可协议的区别
下图表示各个版本对应的许可协议
特别关注:OracleJDK与JRE
OracleJDK 8及以前版本,安装后在JDK目录下会提供一个JRE目录,功能同单独JRE,但从OracleJDK 9开始不再包含JRE目录。
OracleJDK 10及以前版本,都提供独立的JRE安装包下载,但OracleJDK 11及以后版本,不再提供独立的JRE安装包下载,JDK满足开发与运行环境。
3. AdoptOpenJDK
2017年,一群Java用户组(JUG)成员、开发者和供应商(包括亚马逊、微软、Pivotal、Redhat等)建立了一个社区称作AdoptOpenJDK。他们提供免费、稳固的OpenJDK build,可用性与更新周期更长。甚至还有两个不同的Java虚拟机可供选择:HotSpot和OpenJ9,请参考两种虚拟机测试对比,其中,HotSpot为JVM默认类型,OpenJ9为IBM优化版。
AdoptOpenJDK官网提供OpenJDK包自定义构建选择,支持OpenJDK版本选择与JVM类型选择。
2021年7月24日,AdoptOpenJDK开始迁移至Eclipse基金会维护,AdoptOpenJDK的发布也将根据JVM类型分别到相应的平台下载:
特别关注:各操作系统供应商默认集成的OpenJDK为OracleOpenJDK,但根据Oracle后续的授权协议以及各OpenJDK供应商的政策,不排除操作系统默认集成的版本会变更,请开发者关注。
OracleJDK安装
本文介绍OracleJDK安装,以JDK 8u201为例。
特别关注:CPU架构
获取安装包之前,确认Linux服务器的CPU架构,如果服务器架构与JDK不符,则无法运行
#arm架构 [app@ecs-4bcb-0003 ~]$ arch aarch64 [app@ecs-4bcb-0003 ~]$ uname -a Linux ecs-4bcb-0003.novalocal 4.19.90-23.8.v2101.ky10.aarch64 #1 SMP Mon May 17 17:07:38 CST 2021 aarch64 aarch64 aarch64 GNU/Linux [app@ecs-4bcb-0003 ~]$ cat /proc/version Linux version 4.19.90-23.8.v2101.ky10.aarch64 (KYLINSOFT@localhost.localdomain) (gcc version 7.3.0 (GCC)) #1 SMP Mon May 17 17:07:38 CST 2021 #x86架构 [app@host-10-169-3-54 ~]$ arch x86_64 [app@host-10-169-3-54 ~]$ uname -a Linux host-10-169-3-54 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux [app@host-10-169-3-54 ~]$ cat /proc/version Linux version 3.10.0-957.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Thu Nov 8 23:39:32 UTC 2018
组件安装操作步骤参考 组件安装部署手册模板,根据不同组件的安装目标,部分操作可以省略。
本文将按照该参考步骤执行。
一、获取组件可执行程序库,包括主程序,此为组件的基本文件
OracleJDK支持rpm安装与二进制文件安装。
1.rpm安装
1.1 官方获取rpm安装包
创建目录 /usr/local/jdk,将rpm包下载到该目录下
特别关注:Oracle官方启用了相关权限验证,无法通过wget下载文件
1.2 安装
[root@localhost jdk]# rpm -ivh jdk-8u201-linux-x64.rpm 警告:jdk-8u201-linux-x64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID ec551f03: NOKEY 准备中... ################################# [100%] 正在升级/安装... 1:jdk1.8-2000:1.8.0_201-fcs ################################# [100%] Unpacking JAR files... tools.jar... plugin.jar... javaws.jar... deploy.jar... rt.jar... jsse.jar... charsets.jar... localedata.jar... [root@localhost jdk]#
1.3 确认安装目录
安装完成后,主程序文件保存在 /usr/java/jdk1.8.0_201-amd64/,并在 /usr/bin、/var/lib等目录下创建软连接
[root@localhost jdk]# find / -name java /etc/alternatives/java /var/lib/alternatives/java /usr/bin/java /usr/local/temp/jdk1.8.0_201/bin/java /usr/local/temp/jdk1.8.0_201/jre/bin/java /usr/java /usr/java/jdk1.8.0_201-amd64/bin/java /usr/java/jdk1.8.0_201-amd64/jre/bin/java
2.二进制文件安装
2.1 官方获取二进制安装包
创建目录 /usr/local/jdk,将二进制包下载到该目录下
特别关注:Oracle官方启用了相关权限验证,无法通过wget下载文件
2.2 解压安装
所有程序文件都保存在解压目录下
[root@localhost jdk]# tar -zxvf jdk-8u201-linux-x64.tar.gz [root@localhost jdk]# cd jdk1.8.0_201/ [root@localhost jdk1.8.0_201]# ll 总用量 25816 drwxr-xr-x 2 10143 10143 4096 12月 16 03:27 bin -r--r--r-- 1 10143 10143 3244 12月 16 03:27 COPYRIGHT drwxr-xr-x 3 10143 10143 132 12月 16 03:27 include -rw-r--r-- 1 10143 10143 5236122 12月 16 00:44 javafx-src.zip -rw-r--r-- 1 10143 10143 195 12月 16 03:27 jmc.txt drwxr-xr-x 6 10143 10143 198 12月 16 03:27 jre drwxr-xr-x 4 10143 10143 31 12月 16 03:27 legal drwxr-xr-x 4 10143 10143 223 12月 16 03:27 lib -r--r--r-- 1 10143 10143 44 12月 16 03:27 LICENSE drwxr-xr-x 4 10143 10143 47 12月 16 03:27 man -r--r--r-- 1 10143 10143 159 12月 16 03:27 README.html -rw-r--r-- 1 10143 10143 123 12月 16 03:27 release -rw-r--r-- 1 10143 10143 21160792 12月 16 03:27 src.zip -rw-r--r-- 1 10143 10143 190 12月 16 00:44 THIRDPARTYLICENSEREADME-JAVAFX.txt -r--r--r-- 1 10143 10143 190 12月 16 03:27 THIRDPARTYLICENSEREADME.txt [root@localhost jdk1.8.0_201]#
二、安装系统服务
jdk为java程序运行环境,无需独立运行,即无需安装系统服务
三、主程序加入到环境变量
1.rpm安装完成后,自动在环境变量目录 /usr/bin/ 创建java主程序文件
2.二进制安装完成后,需要手动配置环境变量
编辑 /etc/profile 文件,增加如下内容,然后执行 source /etc/profile 使环境变量生效
#java env export JAVA_HOME=/usr/local/jdk/jdk1.8.0_201 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin export PATH=$PATH:${JAVA_PATH}
四、配置文件
jdk为java程序运行环境,无需独立运行,即没有配置文件
五、运行用户
jdk为java程序运行环境,无需独立运行,即无需运行用户
六、开机启动
jdk为java程序运行环境,无需独立运行,即无需配置开机启动
七、服务启动运行
验证jdk安装效果,使用OracleJDK会显示Java商标
[root@localhost jdk1.8.0_201]# java -version java version "1.8.0_201" Java(TM) SE Runtime Environment (build 1.8.0_201-b09) Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode) [root@localhost jdk1.8.0_321]#
附录:OracleJDK每次发布2个版本号
从 2014 年 10 月发布 Java SE 7 Update 71 (Java SE 7u71) 开始,Oracle在发布Oracle JDK关键补丁更新 (CPUs:Critical Patch Updates) 的同时一般会发布相应的补丁集更新 (PSUs:Patch Set Updates)。那么CPUs和PSUs之间有什么区别呢?
- Oracle JDK 关键补丁更新 (CPUs) 包含安全漏洞修复和重要漏洞修复,Oracle 强烈建议所有Oracle JDK用户及时升级到最新的 CPU 版本,Oracle JDK 关键补丁更新 (CPUs) 版本号采用奇数编号!
- Oracle JDK 补丁集更新 (PSUs) 包含相应 CPUs 中的所有修复以及其他非重要修复,仅当您受到Oracle JDK关键补丁更新 (CPUs)版本之外的其他漏洞的影响时才应当使用相应的补丁集更新 (PSUs) ,Oracle JDK 补丁集更新 (PSUs) 版本号采用偶数编号!
所以,一般情况下我们只要下载奇数编号的最新版本更新就行了!