当前位置: 首页 > news >正文

JDK环境变量

JDK&环境变量

前景

昨天帮同学配置Tomcant环境变量的时候,需要查看他 JDK 的安装路径,他突然问我为什么 Java 需要安装 JDK,之前学习的 C 不需要呢,直接安装就可以编译运行了,Java 为什么这么复杂?

突然我也不清楚该怎么回答,所以今天我决定寻找其中的答案再探索一下配置环境变量是在干嘛?有什么作用?


JDK(Java Developing Kit)Java开发中的工具包

通过上网浏览,得到一下信息。

我们知道电脑的操作系统(OS)是由汇编和 C 语言写的,因此 OS 无法直接识别其他的语言,这个时候我们就需要添加一个编译环境,将其他的语言编译为 OS 能够识别的语言。

当我们在电脑编译 Java 语言的时候就需要一个翻译的平台,所以有了一个可以跨系统的 JDK,他的初步作用也就出来了。

Java的编译过程大概为:

Java 源程序 ⟶ \longrightarrow JDK把 Java 翻译为.class 的文件 ⟶ \longrightarrow JDK中包含的jre运行.class文件解释为中间代码 ⟶ \longrightarrow 传送给OS(C 语言识别、汇编语言识别) ⟶ \longrightarrow 转变为二进制


JDK是Java语言的软件开发工具包,在JDK的安装目录下面有一个jre目录,里面有两个文件夹 bin 和 lib,我们可以认为 bin 里的就是jvm(真正对Java进行编译的),lib则是jvm工作所需要的类库,jvm和lib合起来称为jre。

通俗来讲:JDK是整个Java的核心,包括了Java运行环境和Java基础的类库。

JRE (Java Runtime Environment) Java执行的环境

我们上面提到的JRE指的是Java的运行环境,包含 JVM 和 Java 核心类库。简单来说,如果你只是想要运行一个已经开发好的 Java 程序,那么只需要安装 JRE 就可以了。

JVM(Java Virtual Machine)Java虚拟的机器

即Java虚拟机,是 Java 程序的运行核心。它是一个抽象的计算机,有自己的指令集和内存管理机制。JVM 负责加载字节码文件,并将字节码解释或编译成机器码,在不同的操作系统上提供统一的运行环境,实现了 Java 程序 “一次编写,到处运行” 的特性。


环境变量

先从定义来看

环境变量是操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序将使用到的信息。可以把环境变量理解为操作系统在运行过程中能够访问的一些 “全局变量”,系统或应用程序可以通过读取这些变量的值来确定某些操作的行为或路径。

也就是说,环境变量先当与程序中的全局变量,我们配置他就是为了在任意位置都可以使用他,不需要再返回到他所在的路径下再去打开使用他。

配置环境变量的原因

1、方便程序的调用

当你安装了某个软件或者工具后,其可执行文件通常位于特定的目录下。如果不配置环境变量,每次想要使用这个软件或者工具时,都需要在命令行中输入其完整的路径。

例如,在 Windows 系统中,如果 JDK 安装在 C:\Program Files\Java\jdk1.8.0_271\bin 目录下,不配置环境变量的话,每次使用 javac 命令编译 Java 程序时,都需要输入完整路径 C:\Program Files\Java\jdk1.8.0_271\bin\javac。而配置了环境变量后,只需要输入 javac 命令即可,系统会自动在环境变量指定的路径中查找该命令对应的可执行文件。

2、支持多个工具的协同工作

很多时候,一个软件或工具可能依赖于其他软件或工具的存在。通过配置环境变量,可以让这些软件或工具能够找到彼此所需的资源和库文件,从而实现协同工作。

例如,在 Java 开发中,一些第三方库可能需要知道 JDK 的安装路径才能正常工作,通过配置 JAVA_HOME 环境变量,这些库就可以根据该变量的值找到 JDK 的相关文件。

3、提高系统的灵活性和可维护性

配置环境变量可以将软件或工具的路径等信息集中管理,当软件或工具的安装位置发生变化时,只需要修改环境变量的值,而不需要修改所有依赖该软件或工具的程序中的路径信息。这样可以大大提高系统的灵活性和可维护性,减少因路径变更带来的错误和麻烦。

4、实现多版本软件的切换

在开发过程中,有时可能需要同时使用同一个软件的不同版本。通过配置环境变量,可以方便地在不同版本之间进行切换。例如,在 Java 开发中,可以通过修改 JAVA_HOME 环境变量的值来切换不同版本的 JDK。

http://www.xdnf.cn/news/165511.html

相关文章:

  • 备忘录模式 (Memento Pattern)
  • Java 自定义TCP协议:【特点编码字符串<=>字节<=>特点编码16进制】16进制字符串和编码的转换 (各种编码通过字节向16进制的互转)| XOR计算
  • dubbo 异步化实践
  • 【MFA】✈️集成谷歌TOTP实现MFA多因素认证
  • 数组的多种声明方式:类型标注与泛型数组
  • 做大模型应用所需的一点点基础数学理论
  • 扩展和自定义 asammdf 库:满足特定需求的解决方案
  • 文章记单词 | 第46篇(六级)
  • 深度学习中的预训练与微调:从基础概念到实战应用全解析
  • Threejs中顶视图截图
  • javase和java有什么区别
  • spring响应式编程系列:异步生产数据
  • 第八课四则运算 设计运算器
  • 三维重建(二十)——思路整理与第一步的进行
  • 2025上海车展| 和芯星通发布覆盖车载全场景的产品方案
  • [Windows] 易剪媒 v0.0.8 绿色版 —— 跨平台AI批量自动剪辑视频工具
  • 罗技Flow跨电脑控制
  • 三菱PLC软元件 定时器 计数器 状态继电器 编码器
  • Volcano 进阶实战 (二) - (网络拓扑/负载感知)调度
  • 深入解析Dify中的文本清洗处理器:CleanProcessor详解
  • 玩转Pygame绘图:从简单图形到炫酷精灵
  • 构造函数有哪些种类?
  • 敦普水性低温烤漆:金属涂装80℃烘烤的防护体系
  • 牛客:BM1 反转链表
  • 利用 functools.lru_cache 优化递归算法
  • GPU 加速库(CUDA/cuDNN)
  • 每日面试实录·滴滴·校招·JAVA
  • MIL、SIL、HIL与Back-to-Back测试详解:从模型到硬件的完整验证链
  • ultralytics 目标检测 混淆矩阵 背景图像 没被记录
  • docker 常用配置