1. JDK环境解析

本篇将会介绍JDK的构成以及各部分的功能。

JDK = JRE + 开发工具。

 

JRE = JVM + 类库。

1.1 JVM

Java Virtual Machine (Java 虚拟机), 是一个虚构出来的计算机,能模拟计算机功能。

JVM屏蔽了具体操作系统平台的信息,

这就是Java的能够“一次编译,到处运行”的原因。

 

JVM 将字节码解析为机器码。

1.2 JRE

Java Runtime Environment java 运行时环境,主要包括JVM和Java程序所需的核心类库lib等。

JRE = JVM + 类库。

在JDK的安装目录里可以找到JRE目录,里面有两个文件夹bin和lib。

bin: binary 二进制文件,

存放的是调试后可运行的文件。

 

lib: library 类库,

存放需要引用的类库 即 jar包。

因为在解释.class文件的时候 JVM 需调用类库 lib (JRE里有运行.class文件的java.exe),所以光有JVM不能执行.class文件。

可以认为,

 

bin里的是JVM。

 

lib里的是JVM工作所需要的类库。

 

JVM和 lib和起来就称为JRE。

 

可以理解成虚拟机平台+虚拟机本体(JVM)的关系。

JRE给普通用户提供了运行java文件的环境。

1.3 JDK

Java Development Kit java 开发工具,包括了JRE, Java开发工具(如编译器和调试器)和Java基础的类库。

JDK = JRE + 开发工具。

在JDK安装目录下面有六个文件夹、一些声明文件、一个src.zip压缩文件。主要是bin、include、lib、 jre这四个文件夹起作用。

bin: 存放各种工具命令(如: 编译器 javac.exe)。

 

include:  java和JVM交互用的头文件

 

lib:  JDK工具命令的实际执行程序 (最终调用)

 

jre:  JRE (java运行环境)

 

db:  安装JavaDB的路径

 

demo:  存放JDK提供的演示代码

 

sample:  JDK提供的一些简单示例代码

 

src.zip:  Java所有核心类库的源代码

总的来说JDK是用于java程序的开发, 而JRE则是只能运行.class文件而没有编译的功能。



常见使用流程:

我们利用 JDK (调用 Java API 开发工具)编写出 Java 源代码,存储于 .java 文件中。

 

JDK 中的编译器 javac 将 Java 源代码编译成 Java 字节码,存储于 .class 文件中。

 

JRE 加载、验证、执行 Java 字节码。

 

JVM 将字节码解析为机器码并映射到 CPU 指令集或 OS 的系统调用。

强调:

JDK有 javac.exe , JRE没有。

(javac指令是用来将java文件编译成class文件的,这是开发者需要的, 而用户是不需要的。)

 

JDK是开发环境,JRE是运行环境。

JVM 本身不能执行 .class 文件,需要 JRE 下的 lib 类库的支持。

2. JDK安装

2.1 为什么使用JDK8

2.1.1 更新

  • Oracle平均每隔6个月就发布一个新版本,导致很多人对上个版本都没精通,下个版本就已经发布了。

2.1.2 稳定

  • 软件需要的就是稳定,对于不是人人都使用最新版的情况。大环境倾向于使用JDK8。(新版本可以兼容旧版本,而旧版本不能运行新版本)
  • 新版本不稳定,对于出现的每一个小bug都会消耗很多精力去解决。
  • 对于已完成的项目软件来说,更新极有可能导致很多未知的运行时错误和编译器错误。

2.1.3 需求

  • JDK8使用时间已久,大大小小的特性,bug 都摸清楚了,用起来更方便。
  • 如果出现了一些不可修复问题,而如果能够回退版本就能解决的话,那么很多时候的选择是回退版本。
  • JDK8完全可以满足需要,新版本没有改革性的更新 (没有改变版本的核心动力)。

以下摘抄自知乎

https://zhuanlan.zhihu.com/p/139274956

在Java8之前,用户接受更高版本的Java的过程非常缓慢,想要跟上每六个月就要升级的步伐,实在是太难了。

 

对于企业来说,这种升级分分钟会带来兼容性的致命问题,风险也是非常大的,尤其面对庞大而又复杂项目。

 

而且JDK是个非常核心的基础设施,除了安全漏洞,基本上是不会再去动生产环境JDK了,而且出了安全事故谁也承担不了这个责任。

 

在这么多的版本中,只有Java8、Java11和未来的Java17是长期支持版本(LTS),Oracle会支持3年,其他的只会支持6个月,新版本一出,就放弃老版本的技术支持,这也是很少有人使用9~14的版本的原因。

 

那程序员们还有必要学习Java的新版本吗?

 

我认为是有必要的。

 

从技术来看:Java小版本更新基本上都是修复各种漏洞和bug,不会去改变现有的JDK,JDK其实都差不多,我们只需要知道它新增了什么功能而已,从这一点来看其实也增加不了很多的学习成本。

 

当Java大版本的更新,比如JDK7->JDK8,会增加一些新特性,花几个小时看看realse

note就可以完成学习了,同样花不了程序员们的很多时间。

 

从个人来看:虽然很多公司还在用JDK6-7-8,但是我们更应该关注的是自身的知识基础和学习能力,不要因为现在公司的Java技术停留在某个版本上面而放弃学习,我们可以不为企业更新Java版本,但我们要为自己的知识深度与广度学习更多的Java知识。

如果你只会Java1.7,那么你的求职范围只能在使用Java1.7的公司中,一个用得上Java8、11、12的公司为什么要招一个连Java8都不会的人呢?

 

除了留意版本更新,程序员们同时要留意基于Java的一些流行框架和新技术,比如近几年兴起的SpringBoot、SpringCloud等。

 

一句话就可以概括:企业升不升级是他的事,你学不学是你的事。

2.2 安装JDK

本篇提供官网渠道和网盘下载。各位按照自己需求自行选择。

2.2.1. 官网下载

下载是要账号的,如果没有的话可以注册一个。

下载的时候会有提示。

首页: https://www.oracle.com/index.html



选择JDK版本的界面:

https://www.oracle.com/java/technologies/javase-downloads.html

当前看到的是JDK15,把界面往下翻,

一直翻到JDK8 ,选择JDK下载。



这里选自己需要的版本。我下的是 windows-x64。



同意弹出的提示后下载。

2.2.2. 网盘下载

链接:https://pan.baidu.com/s/1LgFhwr0-ur_sZEJZCrLh-Q 提取码:m6bg

安装JDK的时候根据提示进行下一步就好了,安装位置建议放在C盘以外的地址。

3. java环境配置

3.1 配置环境变量

3.1.1 配置JAVA_HOME

右击此电脑/我的电脑->属性->高级->环境变量->系统变量->新建

变量名: JAVA_HOME

变量值: JDK的安装地址



输入完成之后点确认

3.1.2. 配置PATH

找到path,双击或者点编辑->新建

输入: %JAVA_HOME%\bin

点确定保存。

3.1.3 配置CLASSPATH

这一步了解就好,原因在后面会讲到。

变量名: CLASSPATH

变量值: .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar



点确定保存变量

3.2. 测试环境变量

快捷键 “win + R”   ->  输入cmd  ->  确定

在命令窗口输入: java -version

-> 按回车



配置成功。

3.3 编写第一个java程序

创建一个后缀为.java的文件(尽量在纯英文文件夹下),

 

如果不会的话可以 查看->勾上文件拓展名

新建文本文档 -> 右键重命名

有提示直接确认就可以了。

创建成功。



在里面写入测试代码。

public class Test{ //class后面的单词要与文件名保持一致

  public static void main(String args[]){

    System.out.println("Hello world!");
} }

保存。

再次打开命令窗口(“ win + R ”   ->  输入cmd  ->  确定)。

在命令窗口输入 D: //文件所在的硬盘位置
->回车

在命令窗口输入: cd+空格+文件位置

 

不知道 .java 文件的地址,可以直接点文件管理器上方的文件夹图标即可显示路径

然后复制

在命令窗口输入:cd D:\dd\test   //文件位置
->回车
在命令窗口输入:javac Test.java //编译文件
->回车

执行成功之后, 在相同的目录下会有一个Test.class文件,

 

这是编译之后给计算机看的文件。

在命令窗口输入:		java HelloWorld
->回车
命令窗口会打印/显示: Hello World!



编码完成。

4. 配置环境变量的目的

配置环境变量的目的很简单:为了在命令行窗口(dos)下编译和运行Java程序。

由于java开发命令不属于Windows本身命令,所以需要进行路径配置才可以使用。

4.1 配置JAVA_HOME环境变量目的

JAVA_HOME环境变量指向 JDK 的安装目录。

  • 方便引用->把路径配置在 JAVA_HOME 里,PATH 可以直接引用 %JAVA_HOME% 。

  • 归一原则->当JDK路径发生改变时, 仅需更改JAVA_HOME的变量值。

  • 约定协议->一些常用的 java开发软件 (比如Eclipse) 都是默认通过搜索 JAVA_HOME 变量来找到并使用JDK的。

4.2 配置PATH环境变量目的

现在知道了.java 文件需要先转换成 .class 文件才能被电脑识别,

也就是 源文件 -> 二进制字节码,

而我们在命令窗口用到的java命令,如

javac 把.java文件编译成.class文件。

 

java 运行.class文件。

  • 这些命令都是通过我们配置的PATH环境变量找到相应的 (bin文件夹中)

    java.exe和javac.exe文件,计算机才能正确识别并执行我们输入的java命令。

配置完成之后,操作系统就可以调用 javac.exe 和 bin 文件夹下其它的可执行文件,包括执行Java程序的java.exe。

 

path是Windows查找.exe文件的路径

4.3 配置CLASSPATH环境变量目的

在java开发过程中,我们会用到很多自带的标准类库,所以告诉计算机如何找到它们是必须的。

将Java源程序编译成.class文件之后,才可以执行Java程序。

 

而执行Java程序需要让虚拟机(JVM)知道.class文件的位置并导到内存

  • JVM就是通过CLASSPATH来寻找类的。

变量的值: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

 

“.”     当前目录

 

dt.jar    运行环境的类库

 

tools.jar   工具类库

没有以上两个类库的支持,很多Java程序就无法运行。

启动jvm的时候,jvm会根据classpath环境变量所保存的路径信息下去寻找对应的class文件。而自JDK1.5以后,JRE能自动搜索目录下类文件,并且加载dt.jar和tool.jar的类。

CLASSPATH 是jvm查找.class文件的路径。

现在,很多IDE(集成开发环境)不需要配置环境变量,也能正确编译和运行Java程序。

我们只需要在IDE (如: IDEA) 当中相关的配置菜单下,正确的指定出JDK的安装路径就可以了。

总结:

JAVA_HOME 配置提供JDK的按照目录。

 

PATH 配置提供的是java的编译环境。

 

CLASSPATH 配置提供的是java的运行环境。

有什么建议都欢迎发到评论区讨论,每一条留言我都会看的。

参考资料:

  1. 都2020年了,我还在用Java8!

  2. 为什么很多公司选择不升级JDK版本,仍然使用JDK8?

  3. java变量设置_java环境变量的详细配置

  4. 浅谈JDK、JRE、JVM区别与联系

  5. Java的.lib库、.jar包、.Class文件? JDK中的各个文件的作用是什么?

JDK环境解析,安装和目的的更多相关文章

  1. linux应用之jdk环境的安装(centos)

    一.yum安装 1.执行:yum search jdk 已加载插件:fastestmirror, securityLoading mirror speeds from cached hostfile ...

  2. ubuntu-12.04.1-desktop-x64下JDK环境的安装与配置

    1.上oracle官网下载最新的JDK.在这里,我的系统是ubuntu-12.04.1-desktop-amd64,目前位置JDK的最新版本位7u9.jdk-for-linux有两种安装包,一种是rp ...

  3. JDK环境变量安装正确还报错的情况解决方案

    环境变量 JAVA_HOME , PATH 都已配置完毕,并且 java -version也显示正确如下 E:\apache-tomcat-8.0.30-windows-x64\apache-tomc ...

  4. java配置环境及安装

    1.安装JDK开发环境 首先登陆https://www.oracle.com 第一步:Products ---- Java ---- Download java(JDK) for Developers ...

  5. Linux环境下安装Maven

    最近在搞虚拟机,记录下虚拟机内Maven环境的搭建流程 一.选择合适的版本(由于Maven运行需要依赖于JDK,所以安装之前需要保证当前虚拟机下已经安装并配置好JDK环境,安装流程参见) https: ...

  6. 如何配置JAVA环境并安装IEAD软件

    安装IDEA软件之前需要做哪些准备? 在安装IDEA软件之前,需要先确定电脑中有没有JDK,如果没有需要先安装JDK. JDK是整个JAVA的核心,包括了Java运行环境,Java工具(javac/j ...

  7. 基于Windows环境下Myeclipse10.0下载安装破解及jdk的下载安装及环境变量的配置

    jdk的安装及环境变量的配置 1.安装JDK开发环境 附上jdk安装包的百度云链接 链接:http://pan.baidu.com/s/1mh6QTs8 密码:jkb6(当然自行去官网下载最好哒,可以 ...

  8. 番外篇1:在Windows环境中安装JDK

    他山之石,可以攻玉!欢迎关注我的微信公众号 本文作为构建第一个Java程序的番外篇一,跟大家探讨下在Windows下怎么安装JDK.由于本人没有Mac,因此如果是Mac的同学,请自行百度哦! 读前预览 ...

  9. linux上安装jdk环境

    只在于安装jdk1.6.jdk1.7和jdk1.8,其他版本请绕行,目的在于方便自己和大家以后急于做jdk环境,苦于没有jdk安装包和设置变量的过程,我将安装包均放在云盘中, 需要直接在连接中找即可: ...

随机推荐

  1. 在plsql/developer的命令窗口执行sql脚本

    在plsql/developer的命令窗口执行sql脚本的命令是@+路径. 命令窗口,如下: 1.在指定位置创建.sql文件 2-1.输入@,点击回车,选择.sql文件 2-2.或者@加路径

  2. C# 给Word不同页面设置不同背景

    给Word文档设置背景时,通常只能针对整篇文档设置统一的背景,如果需要对某些页面单独设置背景,则需要通过另外的方式来实现.本文通过C# 程序代码演示如何来实现.并附VB.NET代码作参考. 思路:通过 ...

  3. 制作MySQL的Windows服务+创建用户及授权

         在上一篇随笔中详述了MySQL的Windows 64位版本的安装,以及初始化操作.启动服务端.客户端连接.一些基本的文件操作等.然而在进行这些操作的时候,需要我们去输入一长串的路径和命令才能 ...

  4. Think in Java 第四 五 章

    Think in Java 第四章 控制执行流程 测试while public class whileTest { static boolean condition(){ boolean result ...

  5. Codeforces Round #652 (Div. 2)D. TediousLee 推导

    题意: Rooted Dead Bush (RDB) of level 1是只有一个点,如下图 当(RDB) of level i变成(RDB) of level i+1的时候,每一个顶点要进行下面的 ...

  6. Codeforces Round #428 (Div. 2) C. Journey (简单搜索)

    题意:给你一颗树(边是无向的),从根节点向下走,统计走到每个子节点的概率,求所有叶子节点的深度乘上概率的和. 题解:每层子节点的概率等于上一层节点的概率乘\(1\)除以这层的子节点数,所以我们用\(d ...

  7. 考研路茫茫——单词情结 HDU - 2243 AC自动机 && 矩阵快速幂

    背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般 ...

  8. 《软件建模与分析》——UML基本概念

    UML-基本概念 UML本质上是一种语言,语言的学习离不开基本的单词(元素)和语法(视图.模型)的学习,今天我们就从它们开始. 元素 类图中的关系 控制权限 继承 实现 依赖:一个类A使用到了另一个类 ...

  9. haproxy 2.2代理后端https服务

    globalmaxconn 100000chroot /usr/local/haproxystats socket /var/lib/haproxy/haproxy.sock mode 600 lev ...

  10. 模板 Dijkstra+链式前向星+堆优化(非原创)

    我们首先来看一下什么是前向星.   前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和 ...