一、安装
1、Linux
- 查看是否安装open JDK
[root&localhost /]# rpm -qa|grep jdk
# 如果有 --> 卸载
[root&localhost /]# yum -y remove xxxx
[root&localhost /]# mkdir /app/java
[root&localhost /]# tar -zxvf jdk-8u341-linux-x64.tar.gz /app/java
- 配置JDK环境变量
[root&localhost /]# vi /etc/profile
export JAVA_HOME=/app/jdk1.8.0_341
export CLASSPATH=$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin
- 刷新配置环境使其生效
[root&localhost /]# source /etc/profile
- 查看
[root&localhost /]# javac
[root&localhost /]# java -version
[root&localhost /]# echo $PATH
2、Windows
-
下载安装:oracle官网
-
双击下载完成的文件进行安装,选择安装路径(尽量安装在固态硬盘),之后一路下一步
- 配置环境变量
a. 右键 “此电脑/计算机”,点击 “属性”,点击 “高级系统设置”,点击 “环境变量”
b. 新建 JAVA_HOME 变量:在系统变量中,点击 “新建”
c. 选择性配置 CLASSPATH 变量:在系统变量中,点击 “新建”
d.编辑Path变量,将“%JAVA_HOME%\bin”和“%JAVA_HOME%\jre\bin”加入Path的变量值中
e.每次编辑完“环境变量”,都要点击“确定”加以保存,否则配置无效
- 测试
点击win+R 输入cmd 打开命令行窗口,输入 java -version
3、JDK为何要配Path和ClassPath?
- JDK运行原理
一个xxx.java文件要想被运行,首先要被javac.exe编译生成字节码文件 ----> xxx.class文件
然后JDK中的Java命令运行此xxx.class文件,java代码就可以被执行。
- 为什么要配置Path
平时使用cmd运行JDK中的命令时,只能在JDK的安装目录下运行如 javac和java命令。但是一旦脱离了当前安装目录,对于编写的java文件就没办法继续执行,会提示没有此命令。所以要想在任何目录下都能运行JDK命令,就需要在path中配置JDK的安装路径。这样,在cmd中运行java命令时,会先从当前目录进行查找,如果查找不到此命令的执行程序,便会到path路径查找,path中配置了JDK的安装路径,所以此时在任何目录下都能编译执行Java文件。
- 为什么要配置ClassPath
F:\workspace 目录下Java程序不能在 F:根目录执行,因为F盘根目录压根没有此java程序源码,调用javac和java无法执行。ClassPath的作用就是配置好一个java程序存放路径。当在其他任何目录下执行一个当前目录没有的java程序时,会优先去ClassPath配置的路径中进行查找,如果没有在到当前目录下查找。
jdk1.5以后一般都不配置ClassPah
特别注意:配置方式上有所不同,如果单纯的配置一个路径结尾没有 " ;. ",那么只会去ClassPath配置的路径下查找,找不到就会提示文件不存在。配置了“ ;. ” 才会在配置路径找不到文件的情况下再去当前目录查找。
4、jdk目录说明
bin文件里面存放了JDK的各种开发工具的可执行文件,主要的是编译器(javac.exe)
db文件是一个先进的全事务处理的基于Java技术的数据库(jdk自带数据库db的使用)
include文件里面是Java和jvm交互用的头文件
jre为java运行环境
lib文件存放的是JDK工具命令的实际执行程序
二、JDK、JRE、JVM
1、定义
**JVM(Java Vitrual Machine)**Java虚拟机:JVM就是一个虚拟的用于执行bytecode字节码的“虚拟计算机”
JRE(Java Runtime Environment) 是 Java 的运行环境。面向 Java 程序的使用者,而不是开发者。如果你仅下载并安装了 JRE,那么你的系统只能运行 Java 程序。JRE 是运行 Java 程序所必须环境的集合,包含 JVM 标准实现及 Java 核心类库。它包括 Java 虚拟机、Java 平台核心类和支持文件。它不包含开发工具(编译器、调试器等)。
JDK(Java Development Kit) 又称 J2SDK(Java2 Software Development Kit),是 Java 开发工具包,它提供了 Java 的开发环境(提供了编译器 javac 等工具,用于将 java 文件编译为 class 文件)和运行环境(提 供了 JVM 和 Runtime 辅助包,用于解析 class 文件使其得到运行),面向Java程序的开发者。如果你下载并安装了 JDK,那么你不仅可以开发 Java 程序,也同时拥有了运行 Java 程序的平台。JDK 是整个 Java 的核心,包括了 Java 运行环境(JRE),一堆 Java工具 tools.jar
和 Java 标准类库 (rt.jar
)
即:JDK包含JRE,JRE包含JVM
2、两套 JRE
安装JDK时一定会在其子目录下面安装一个JRE,同时在安装的过程也会询问你是否要安装一 个外部的JRE,如果我们选择安装则就同时拥有了两个JRE。
安装 JDK的时候会在其子目录下安装一个 JRE,同时在安装的过程也会询问是否要安装一个外部的公共 JRE。如果选择安装则就同时拥有了两个 JRE,一套一般在c:\program files\Java\jre
下,一套自己选择的JDK安装路径下,如:D:\program files\Java\jdk1.8\jre
。前面那套少了Server端的Java虚拟机(jdk1.8.0_281/jre/bin
多了个server文件夹)。
《疯狂Java》:公共JRE是一个独立的JRE系统,会单独安装在系统的其他路径下。公共JRE会向IE浏览器和系统中注册JAVA运行时环境。通过这种方式,系统中任何应用程序都可以使用公共JRE。由于现在在网页上执行Applet的机会越来越少,而且完全可以使用JDK目录下的JRE来运行JAVA程序,因此没有太大必要安装公共JRE
这两个 JRE本质上并没有任何区别,最主要的区别在于:
- JDK目录里面的 JRE主要是设计用来运行JDK自带的那些工具的(Bin目录下),包括
javac.exe
。这些开发工具可以理解为包装器Wrapper(/lib/tools.jar
),制作的目的是为了让开发者免于输入太长的指命,比如:javac.exe
与输入java -cp c:/jdk/lib/tools.jar com.sun.tools.javac.Main
是一样的,会得到相同的结果。/lib
目录下的程序都很小,不大于29K
,JDK里的工具几乎是用Java所编写,所以也是Java应用程序,因此要使用JDK所附的工具来开发Java程序,也必须要自行附一套JRE才行,所以位于JDK目录下的那套JRE就是用来运行一般Java程序的。 - 外部的 JRE在安装的时候会自动注册到操作系统的path里面,一般在
System32
文件夹下可以看到java.exe
、javaw.exe
、javaws.exe
三个文件。jdk 1.8版本,安装时候会注册到环境变量中,在我的电脑\属性\高级系统设置\环境变量\系统变量
中的 path中有个C:\ProgramData\Oracle\Java\javapath
路径值生成,卸载jdk该值依然存在,卸载jre该值自动消失。
因此我们只要安装了外部的JRE(即使JDK没有安装,环境变量没有配置)则运行Java程序时都是用的外部JRE的java.exe
程序来运行的(即使安装了JDK且配置了环境变量)(系统的默认path具有优先)。
验证我们用到的java命令是jre/bin
目录下的方法:把jdk/bin
目录下的java.exe
剪切到别的地方再运行java程序(或者卸载jdk),可以发现程序正常运行。
java.exe 决定使用哪套JRE
在我们的电脑里面至少有两套JRE(如果安装了Borland JBuilder
等高级开发工具,电脑里面会有更多套的JRE),由java.exe
来决定使用哪一套JRE
当我们在命令行输入:java xxx
的时候,java.exe
的任务就是在我们电脑上众多的JRE中找到合适的JRE来执行xxx
。java.exe
依据以下顺序来寻找JRE:
- 自己的目录下有没有JRE目录;
- 父目录下有没有JRE目录;
- 查询注册表
HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\
java.exe
的执行结果与我们电脑里哪一个java.exe
搜索一下就会发现我们电脑里面也不止一个java.exe
)被执行以及哪套JRE来执行java程序有很大的关系。
另外,java.exe
在找到合适的JRE以后,还有一个验证版本的程序,也就是java.exe
与JRE的版本一致才可以执行。如果出现版本不一致的问题,一定要记得两件事情:
- 哪一个
java.exe
被执行 java.exe
找到哪一套JRE
只要这两件事情确定了,我们就抓住了问题的来龙去脉,解决起来也就轻而易举了。
3、环境变量的配置
没有配置环境变量的时候,在jdk/bin
路径下,终端可以正常执行javac命令,切换到别的路径,则报错:“不是内部或外部命令”。
似乎使用集成开发环境如idea或eclipse等开发并编译Java程序,而不使用命令行javac的方式来编译Java程序,那么就可以不配置jdk的环境变量了?
4、JVM
JVM(JAVA Virtual Machine,JAVA虚拟机)是JRE的一部分,JRE是JVM的补充。那么JVM到底在哪里呢?我们打开jdk1.8.0——\jre\bin
,会看到client和server两个目录,在这两个目录中分别可以看到jvm.dll
,这就 是我们所说的JVM之所在。
jdk/jre/bin
下有两个目录:server与client,这就是真正的jvm.dll
所在。 jvm.dll
无法单独工作,当jvm.dll
启动后,会使用explicit的方法(就是使用Win32 API
之中的LoadLibrary()
与GetProcAddress()
来载入辅助用的动态链接库),而这些辅助用的动态链接库(.dll
)都必须位于jvm.dll
所在目录的父目录之中。因此想使用哪个JVM,只需要设置PATH,指向JRE所在目录底下的jvm.dll
最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。