我们通常所说的JDK,其实是指Java开发包,里面包含Java开发用到的工具集。
JDK(Java Development ToolKit),包含了Java运行环境(JRE)和开发工具(编译器,调试器,javadoc等)。我们就是依靠JDK来开发和运行Java程序的。
JDK的编译器Javac[.exe],会将Java代码编译成字节码(.class文件)。编译出的字节码在任何平台上都一样的内容,所以我们说Java语言是门跨平台语言。Write once, run anywhere。
JRE(Java Runtime Environment) ,它为Java提供了运行环境,其中重要的一环就是通过JVM将字节码解释成可执行的机器码。
JRE由JVM,Java运行时类库,动态链接库等组成。
JVM(Java Virtual Machine),Java虚拟机,可以看做是一台抽象化的计算机,它有一套完整的体系架构,包括处理器、堆栈 、寄存器等。
在运行时环境,JVM会将Java字节码解释成机器码。机器码和平台相关的(不同硬件环境、不同操作系统,产生的机器码不同),所以JVM在不同平台有不同的实现。
目前JDK默认使用的实现是Hotspot VM。
下面是JDK的体系结构图:
我们平时所说的JDK,是指SUN公司(现在是Oracle公司的)的官方JDK,由于历史遗留问题,其本身采用的并不是开源协议。所以后来有了OpenJDK----JDK的开源版本。
OpenJDK和JDK有以下几点不同:
- 授权协议不同。 前者采用GPL协议(允许商用),后者是JRL协议(供个人研究使用)
- OpenJDK源代码不完整。其中最主要的部份就是JMX中的可选元件SNMP部份的代码。因此这些不能开放的源代码 将它作成plug,以供OpenJDK编译时使用,你也可以选择不要使用plug。
- 部分源代码(不是SUN产权的源码)用开源替换
- 只包含最精简的JDK,不包含其他软件包,比如Rhino Java DB JAXP
(以上摘自知乎 中的高票答案。)
我们有时候会在Java源码中看到标记为native
的方法,说明该方法是使用C代码实现的。可以通过OpenJDK来看一下是如何实现的。
比如Object类的getClass方法:
public final native Class> getClass();
相应的,在OpenJDK/jdk/src/share/native
目录下,找到Object.c文件,可以看到具体的实现代码:
JNIEXPORT jclass JNICALL
Java_java_lang_Object_getClass(JNIEnv *env, jobject this)
{
if (this == NULL) {
JNU_ThrowNullPointerException(env, NULL);
return 0;
} else {
return (*env)->GetObjectClass(env, this);
}
}
那么上面所说的JRE,JVM具体的是长啥样的呢?我们可以通过查看JDK的目录文件结构一窥真容。
下面以centos7系统下的JDK1.8版本为例,对JDK目录结构做个说明。
[~]$ ls -l jdk
drwxr-xr-x 2 10 143 4096 4月 1 2016 bin
-r--r--r-- 1 10 143 3244 4月 1 2016 COPYRIGHT
drwxr-xr-x 4 10 143 4096 4月 1 2016 db
drwxr-xr-x 3 10 143 4096 4月 1 2016 include
-rwxr-xr-x 1 10 143 5092228 4月 1 2016 javafx-src.zip
drwxr-xr-x 5 10 143 4096 4月 1 2016 jre
drwxr-xr-x 5 10 143 4096 4月 1 2016 lib
-r--r--r-- 1 10 143 40 4月 1 2016 LICENSE
drwxr-xr-x 4 10 143 4096 4月 1 2016 man
-r--r--r-- 1 10 143 159 4月 1 2016 README.html
-rw-r--r-- 1 10 143 525 4月 1 2016 release
-rw-r--r-- 1 10 143 21103627 4月 1 2016 src.zip
-rwxr-xr-x 1 10 143 110114 4月 1 2016 THIRDPARTYLICENSEREADME-JAVAFX.txt
-r--r--r-- 1 10 143 177094 4月 1 2016 THIRDPARTYLICENSEREADME.txt
下面是其中比较重要的目录或文件的含义:
bin目录:Java工具的可执行文件,包括: java、Java编译器javac、反编译.class文件javap、密钥管理工具keytool、Java文档工具javadoc等。
COPYRIGHT文件:版权信息。
db目录:Java实现的数据库。
include目录:.h头文件,C语言开发时用到的头文件。比如jni.h
是开发jni程序时必须引用的头文件。
lib目录: Java类库,我们经常看到的dt.jar
和tools.jar
就在这个目录下。
src.zip文件:Java类库源码,包括了rt.jar库中的关键部分;除了Java类库,还包含了启动器(launcher)的源码(C语言实现)。
jre目录:Java运行环境。后面会展开了讲它的目录结构。
dt.jar
包含了Swing包,是运行环境的类库。目前的发展趋势是Java越来越少的用作GUI开发,所以这个类库基本不会用到了。
tools.jar
是工具类库,bin目录下的可执行程序,好多都会用到这个类库。比如javac[.exe],javadoc[.exe]等。
平时我们经常会将这两个文件配置到CLASSPATH的当前目录(.
)后面。
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
原因就是有些可执行程序在运行时是依赖这些类库的,比如javac[.exe]就依赖tools.jar类库的javac包。
[~]$ ls -l jre
drwxr-xr-x 2 10 143 4096 4月 1 2016 bin
-r--r--r-- 1 10 143 3244 4月 1 2016 COPYRIGHT
drwxr-xr-x 15 10 143 4096 4月 1 2016 lib
-r--r--r-- 1 10 143 40 4月 1 2016 LICENSE
drwxr-xr-x 3 10 143 4096 4月 1 2016 plugin
-r--r--r-- 1 10 143 46 4月 1 2016 README
-rwxr-xr-x 1 10 143 110114 4月 1 2016 THIRDPARTYLICENSEREADME-JAVAFX.txt
-r--r--r-- 1 10 143 177094 4月 1 2016 THIRDPARTYLICENSEREADME.txt
-r--r--r-- 1 10 143 955 4月 1 2016 Welcome.html
bin目录:包含了java运行所需要的可执行文件,比如java[.exe]
lib目录:包含了运行时依赖的java类库和动态链接库(.so或.dll或.dylib)。
jre/lib目录结构:
[~]$ ls -l jre/lib
drwxr-xr-x 4 10 143 4096 4月 1 2016 amd64
-rwxr-xr-x 1 10 143 66024286 4月 1 2016 rt.jar
.....
amd64目录下包含了程序运行所需的动态链接库,在amd64/server目录下,可以找到JVM库:libjvm.so
。
rt.jar文件是java运行时类库,是我们用到最多的基础类库,包括java.lang,java.io,java.net,java.util等。
java.lang
:Java语言包,这个包下的文件不需要显式import。包括:Object类,数据类型相关的类(String,Long,Byte),Class类,线程相关类Thread,异常类Throwable,等。java.io
:I/O操作相关的类。包括:文件类File,FileReader,FileWriter,输入输出流InputStream/OutputStream,等。java.net
:网络相关类。包括:http连接类HttpURLConnection,socket类,等。java.util
:工具类。包括:数据结构相关的类ArrayList、Hashmap,日期类Date,随机数类Random,等。
我们平时用IDE在配置好JDK HOME后,IDE会默认将JDK的类库全部引用进来,供开发使用。以mac下的Itellij IDEA为例,看一下都有那些类:
本文首先讲了JDK相关的一些基础概念;之后通过分析JDK的目录结构,来加深对这些概念的理解。Java体系博大精深,像Java类库、JVM等每个部分都值得深入研究一番,而读源代码是最直接见效最快的方法,强烈推荐用这种方法来学习Java。正所谓:源码面前,了无秘密。
===================================================================================================================================
C:\Program Files\Java\jdk1.7.0_21 -- JDK的根目录,包含一些软件版权,声明,和自述文件,同时包含归档了的Java平台源代码包src.zip
C:\Program Files\Java\jdk1.7.0_21\src.zip -- 归档的Java源代码
C:\Program Files\Java\jdk1.7.0_21\include -- C 语言头文件 支持 用Java本地接口和Java虚拟机接口 来本机代码编程
C:\Program Files\Java\jdk1.7.0_21\lib -- Java开发工具要用的一些库文件,有包含了支持JDK工具的非核心类库tool.jar,dt.jar 归档的 BeanInfo 文件,用于告诉IDE这样显示java组件怎样让开发者在自己的应用程序中用户化它们
================C:\Program Files\Java\jdk1.7.0_21\jre================
C:\Program Files\Java\jdk1.7.0_21\jre -- JDK使用的Java运行环境(JRE)的根目录,这个运行环境实现了Java平台
C:\Program Files\Java\jdk1.7.0_21\jre\bin -- Java平台所要用的工具和库的可执行文件这些可执行文件和 /jdk1.7.0_21/bin相同的。这个路径不需要设置 PATH 环境变量 //Java 启动器工具充当了应用程序启动器(覆盖了1.1版本的JDK推出的旧版本JRE工具)
C:\Program Files\Java\jdk1.7.0_21\jre\bin\client -- 包含Java Hotspot(Java性能引擎) Client Virtual Machine 客户虚拟机要用的DLL文件
C:\Program Files\Java\jdk1.7.0_21\jre\bin\server -- 包含Java Hotspot(Java性能引擎) Server Virtual Machine 服务器虚拟机要用的DLL文件 ----JDK 比 JRE C:\Program Files\Java\jre7\bin多一个server端的java虚拟机。即这个folder “Server” 不存在于JRE下。
C:\Program Files\Java\jdk1.7.0_21\jre\lib -- JRE要用的代码库,属性设置,资源文件。
C:\Program Files\Java\jdk1.7.0_21\jre\lib\rt.jar -- Java 引导类库(java 核心APIRunTime类)
C:\Program Files\Java\jdk1.7.0_21\jre\lib\charsets.jar -- 字符转换类库
C:\Program Files\Java\jdk1.7.0_21\jre\lib\ext -- 默认的Java平台扩展安装环境
C:\Program Files\Java\jdk1.7.0_21\jre\lib\ext\localedata.jar -- ava.text 和 java.util包要用到的地区数据
C:\Program Files\Java\jdk1.7.0_21\jre\lib\security -- 包含安全管理文件,有安全规则(java.policy)和安全属性文件(java.security)
C:\Program Files\Java\jdk1.7.0_21\jre\lib\applet -- Java applets 要的Jar包,可以放到lib/applet/目录,可以节省 applet 类装载器从本地文件系统装载 大的applets 所需的applet类时间,减少从网上下载具有相同的保护的时间。
C:\Program Files\Java\jdk1.7.0_21\jre\lib\fonts -- 包含平台所需的TrueType字体文件
================C:\Program Files\Java\jdk1.7.0_21\db================
C:\Program Files\Java\jdk1.7.0_21\db -- db目录,纯Java开发的数据库 Apache Derby,是一个开源的100%Java开发的关系数据库
有关 Java DB 的信息,请参见 http://developers.sun.com/prodtech/javadb/。
有关 Derby 的文档,请参见:http://db.apache.org/derby/manuals/index.html
================C:\Program Files\Java\jdk1.7.0_21\bin================
C:\Program Files\Java\jdk1.7.0_21\bin -- JDK包含的一些开发工具执行文件
C:\Program Files\Java\jdk1.7.0_21\bin\javac.exe -- 基本工具 - Java语言编译器, 将Java源代码转换成字节码
C:\Program Files\Java\jdk1.7.0_21\bin\java.exe -- 基本工具 - Java应用程序启动器,直接从类文件执行Java应用程序字节代码
C:\Program Files\Java\jdk1.7.0_21\bin\javadoc.exe -- 基本工具 - Java API 文档生成器,从源码注释中提取文档
C:\Program Files\Java\jdk1.7.0_21\bin\apt.exe -- 基本工具 - java 注释处理器
C:\Program Files\Java\jdk1.7.0_21\bin\appletviewer.exe -- 基本工具 - java applet 小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。
C:\Program Files\Java\jdk1.7.0_21\bin\jar.exe -- 基本工具 - java文件压缩打包工具
C:\Program Files\Java\jdk1.7.0_21\bin\jdb.exe -- 基本工具 - Java 调试器,debugger,查错工具
C:\Program Files\Java\jdk1.7.0_21\bin\javah.exe -- 基本工具 - C 头文件和stub生成器,用于写本地化方法,例如生产JNI样式的头文件。产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件
C:\Program Files\Java\jdk1.7.0_21\bin\javap.exe -- 基本工具 - class文件反编译工具,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。
C:\Program Files\Java\jdk1.7.0_21\bin\extcheck.exe -- 基本工具 - 用于检测jar包中的问题
C:\Program Files\Java\jdk1.7.0_21\bin\keytool.exe -- 安全工具 - 管理密钥库和证书.
C:\Program Files\Java\jdk1.7.0_21\bin\jarsigner.exe -- 安全工具 - 生产和校验JAR签名
C:\Program Files\Java\jdk1.7.0_21\bin\policytool.exe -- 安全工具 - 有用户界面的规则管理工具
C:\Program Files\Java\jdk1.7.0_21\bin\kinit.exe.exe -- 安全工具 - 用于获得和缓存网络认证协议Kerberos 票证的授予票证
C:\Program Files\Java\jdk1.7.0_21\bin\klist.exe.exe -- 安全工具 - 凭据高速缓存和密钥表中的 Kerberos 显示条目
C:\Program Files\Java\jdk1.7.0_21\bin\ktab.exe.exe -- 安全工具 - 密钥和证书管理工具
C:\Program Files\Java\jdk1.7.0_21\bin\native2ascii.exe -- Java国际化工具 - 将文本转化为 Unicode Latin-1。详情参考http://java.sun.com/javase/6/docs/technotes/tools/windows/native2ascii.html
C:\Program Files\Java\jdk1.7.0_21\bin\rmic.exe -- 远程方法调用工具 - 生成远程对象的stubs and skeletons(存根和框架)
C:\Program Files\Java\jdk1.7.0_21\bin\rmid.exe -- 远程方法调用工具 - Java 远程方法调用(RMI:Remote Method Invocation) 活化系统守护进程
C:\Program Files\Java\jdk1.7.0_21\bin\rmiregistry.exe -- 远程方法调用工具 - Java 远程对象注册表
C:\Program Files\Java\jdk1.7.0_21\bin\serialver.exe -- 远程方法调用工具 - 返回类的 serialVersionUID.
C:\Program Files\Java\jdk1.7.0_21\bin\tnameserv.exe -- Java IDL and RMI-IIOP 工具 - Provides access to the naming service.
C:\Program Files\Java\jdk1.7.0_21\bin\idlj.exe -- Java IDL and RMI-IIOP 工具 - 生产映射到OMG IDL接口可以使Java应用程序使用CORBA的.java文件
C:\Program Files\Java\jdk1.7.0_21\bin\orbd.exe -- Java IDL and RMI-IIOP 工具 - 为客户可以在CORBA环境下透明的定位和调用服务器的稳定的对象提供支持
C:\Program Files\Java\jdk1.7.0_21\bin\servertool.exe -- Java IDL and RMI-IIOP 工具 - 为应用程序提供易于使用的接口用于注册,注销,启动,关闭服务器
C:\Program Files\Java\jdk1.7.0_21\bin\pack200.exe -- Java 部署工具 - 使用java gzip压缩工具将JAR文件转换为压缩的pack200文件,生产打包文件是高度压缩的JAR包,可以直接部署,减少下载时间
C:\Program Files\Java\jdk1.7.0_21\bin\unpack200.exe -- Java 部署工具 - 解包pack200文件为JARs
C:\Program Files\Java\jdk1.7.0_21\bin\htmlconverter.exe -- Java 插件工具 - Java Plug-in HTML转换器 htmlconverter -gui 可以启动图形界面
C:\Program Files\Java\jdk1.7.0_21\bin\javaws.exe -- Java web 启动工具 - Java web 启动命令行工具
C:\Program Files\Java\jdk1.7.0_21\bin\jvisualvm.exe -- Java 故障检修,程序概要分析,监视和管理工具 - 一个图形化的Java虚拟机,不说了 大家研究一下就发现太酷了.这是想了解JVM的人的神器http://java.sun.com/javase/6/docs/technotes/guides/visualvm/index.html
C:\Program Files\Java\jdk1.7.0_21\bin\jconsole.exe -- Java 故障检修,程序概要分析,监视和管理工具 -java监视台和管理控制台,图形界面的功能太强大了,运行一下就知道 ,不想多说,看了就知道
C:\Program Files\Java\jdk1.7.0_21\bin\schemagen.exe -- Java web 服务工具 - Java构架的XML Schema生成器
C:\Program Files\Java\jdk1.7.0_21\bin\wsgen.exe -- Java web 服务工具 - 生成 JAX-WS
C:\Program Files\Java\jdk1.7.0_21\bin\wsimport.exe -- Java web 服务工具 - 生成 JAX-WS
C:\Program Files\Java\jdk1.7.0_21\bin\xjc.exe -- Java web 服务工具 - 绑定编译器
C:\Program Files\Java\jdk1.7.0_21\bin\jps.exe -- 监视工具 - JVM Process Status 进程状态工具。列出目标系统的HotSpot JJVM , 监视Java虚拟机的性能,不支持Windows 98 和Windows ME 平台
C:\Program Files\Java\jdk1.7.0_21\bin\jstat.exe -- 监视工具 - 按照命令行的具体要求记录和收集一个JVM的性能数据
C:\Program Files\Java\jdk1.7.0_21\bin\jstatd.exe -- 监视工具 - JVM jstat 的守护进程
C:\Program Files\Java\jdk1.7.0_21\bin\jinfo.exe -- 故障检测和修理工具 - 配置或打印某个Java进程VM flag
C:\Program Files\Java\jdk1.7.0_21\bin\jhat.exe -- 故障检测和修理工具 - 堆储存查看器
C:\Program Files\Java\jdk1.7.0_21\bin\jmap.exe -- 故障检测和修理工具 - Java内存图
C:\Program Files\Java\jdk1.7.0_21\bin\jsadebugd.exe -- 故障检测和修理工具 - Java 的 Serviceability Agent Debug的守护进程
C:\Program Files\Java\jdk1.7.0_21\bin\jstack.exe -- 故障检测和修理工具 - Java堆栈跟踪
C:\Program Files\Java\jdk1.7.0_21\bin\jrunscript.exe -- Java脚本工具 - 运行脚本