Java Development Kit(JDK),包括一个完整的Java运行环境(Java Runtime Environment,JRE),还包括一系列用于Java开发的组件和工具(javac、jar、javap、javadoc、jdb、jps、jhat、jstack ……)
JDK 组件
java, javac, jar
- 编译Java源码:
javac -classpath PATH;PATH/xx.jar -sourcepath SOURCE_DIR -d OUTPUT_DIR
- 把.class文件打成Jar包:
jar cvf JAR_FILE_NAME CLASS_FILE_NAMES
- 运行executable的Jar包(Jar包指定了Main-Class):
java -jar JAR_FILE_NAME
- 执行Jar包里的类(该类有main方法):
java -cp JAR_FILE_NAME CLASS_FULL_NAME
- 执行Jar包里的类的指定方法:
java -cp JAR_FILE_NAME CLASS_FULL_NAME METHOD_NAME
, 例如Tomcat 的启动脚本最终是执行了 Bootstrap这个主类中的start方法:
java |
javap, javah
- javah:根据class文件生成h头文件
javah -jni ClassFileName
- javap:反编译class文件成字节码
javap -c ClassFileName
jdb
@todo
javadoc
@todo
jps, jstack, jhat, jmap
@link:: Advanced-Java.02d.JVM分析工具
rt.jar, tools.jar, dt.jar
rt.jar, tools.jar, dt.jar 都包含于JRE(除此之外还JRE包括Java虚拟机):
- rt.jar: rt = runtime, 包括了Java核心类库,
java.*
包下的类; - tools.jar: Jar包工具类, 我们执行的诸如
javac
等命令实际上是通过java
命令调用了tools.jar, 比如javac ClassName.java
相当于java -cp tools.jar xx.Main ClassName.java
; - dt.jar: 主要是Swing类库;
jar文件结构
- jar包中的 META-INFO/MANIFEST.MF:
Main-Class: com.xxx.Test
// 指定该选项可以更简单执行jar:java -jar JAR_FILE_NAME
Class-Path: libXX.jar
// libXX.jar在相同目录下?
Oracle JDK vs Open JDK
区别与联系
免费 vs 付费
- OpenJDK 每6个月发布一个新版本,不过每次新的版本发布后,旧的就不维护了,比如OpenJDK 12发布之后,11版本便停止更新,停留在11.0.2版本,没有LTS版本;
- Oracle JDK同样每6个月发布一个新版本,其中9、10、12是 non-LTS版本,Oracle提供的免费更新只有6个月;
- Oracle JDK 8、11是 LTS版本,提供6个月免费更新,但在这之后的更新不再免费(仅针对商业用户)。
Java 版本 | 发布日期 | Oracle 提供的免费更新 |
---|---|---|
Java 8(LTS) | 2014.3 | 2019.1 |
Java 9 | 2017.9 | 2018.3 |
Java 10 | 2018.3 | 2018.9 |
Java 11(LTS) | 2018.9 | 2019.3 |
Java 12 | 2019.3 | 2019.9 |
使用 Oracle JDK的解决方案:
- Oracle Java 8 (LTS):
- 免费:用 8u192以及更早版本(有安全隐患)
- 交钱使用 Oracle提供的更新(8u211之后的更新)
- Oracle Java 11 (LTS):
- 交钱
- Oracle Java 10、12、13 non-LTS
- 每6个月都升级到下一个版本的JDK
使用其他 OpenJDK的方案:
- Alibaba JDK, 阿里开源自用OpenJDK版本,Java社区迎来中国力量-InfoQ
- Azul Systems发布的Zulu产品线中的Java SE产品, 链接, 下图是Azul JDK的 LTS维护周期:
关于 Oracle的许可协议:
- Oracle JDK 的许可协议有两种:
- BCL(Oracle Binary Code License Agreement): 个人/开发使用免费,商用免费(但商用免费仅限于”通用计算”设备, 移动设备/嵌入式设备不包括在免费领域)。JDK中的某些商业特性(使用
-XX:+UnlockCommercialVMOptions
打开的特性)仍是需要付费才可以使用的; - OTN(Oracle Technology Network License Agreement): 个人/开发使用免费,商用收费;
- BCL(Oracle Binary Code License Agreement): 个人/开发使用免费,商用免费(但商用免费仅限于”通用计算”设备, 移动设备/嵌入式设备不包括在免费领域)。JDK中的某些商业特性(使用
- Oracle 9/10是 BCL, 11/12变成了OTN,Oracle Java SE 11开始,按照OTN(Oracle Technology Network License Agreement)协议规定,只有在开发、测试及原型证明的场景下提供有限的授权。关于授权政策的一些具体问题可以参考下面网页: https://www.java.com/zh_CN/download/faq/distribution.xml @ref
- Oracle JDK 8 在 8u211 和 8u212之后, 许可协议也变成了 OTN(因为 Oracle JDK 8 u192 是2019年1月前发布的最新版本,所以只要一直使用 JDK 8 u192 以及更早的版本,就不需付费)
本节参考:
JDK 版本历史
→ Java version history - Wikipedia
几个重要的 JDK LTS 版本:
- Java SE8: 2014.3~2030.12 (Oracle于2019.1停止商用更新)
- Java SE11: 2018.9~2026.9
- Java SE17: 2021.9~2029.9
本节参考 https://www.51cto.com/article/670298.html
诞生:1995 年 5 月,Oak 语言改名为 Java,标志着 Java 的诞生,并且提出了著名的 Write Once,Run Anywhere 口号。下面用表格形式记录其发版时间轴:
版本 | 发布日期 | 焦点说明 |
---|---|---|
JDK 1.0 | 1996.01 | Java 虚拟机、基础类库 |
JDK 1.1 | 1997.02 | 规定了 Jar 文件格式,JDBC、JavaBeans、RMI 等。开始支持内部类和反射 |
JDK 1.2 | 1998.12 | 引入集合框架 Collections、Map 等。从此版本开始,分为 3 个版本:J2SE/J2EE/J2ME(注:1999.04 著名的 HotSpot 虚拟机诞生,顺势推出了 Java EE 首个版本) |
JDK 1.3 | 2000.05 | 千禧年的第一个版本,对类库进行了优化 |
JDK 1.4 | 2002.02 | 支持正则 Pattern、NIO、JDBC 3.0、assert 断言 |
JDK 5 | 2004.09 | JDK 命名方式变化、自动拆装箱、泛型、枚举、可变参数、增强 for 循环、JUC 并发包等等非常多新特性 |
JDK 6 | 2006.12 | 编译器注解处理器(lombok 的原理)、J2xx 改为 Java XX |
JDK 7 | 2009.02 | try-with-resources、NIO2(也叫 AIO)、泛型推断 |
JDK 8 | 2014.03 | Lambda 表达式、函数式编程、Stream 流式编程、方法引用、接口默认方法、彻底移除 HotSpot 的永久代 |
… | … | … |
JDK 11 | 2018.09 | Jigsaw 模块化、增强类型推断、革命性的垃圾收集器 ZGC |
… | … | … |
JDK 17 | 2021.09 | …敬请期待 |
Java 17(2021 年 9 月 14)新特性:
期间,关于 Java/Sun 公司大事记:
日期 | 事件 |
---|---|
1995.05 | Java 语言诞生 |
1996.01 | JDK 1.0 版本发布 |
1998.12 | JAVA2 企业平台 J2EE 发布(和 JDK 1.2 一起) |
2005.06 | JavaOne 大会召开(Java 诞生 10 周年),J2EE 更名为 Java EE, J2SE 更名为 Java SE,J2ME 更名为 Java ME |
2009.04 | 甲骨文 Oracle 以现金收购 Sun 微系统公司,交易价格 74 亿美元(Sun 公司市值顶峰时超 2000 亿美金。眼看他起高楼,眼看他宴宾客,眼看他楼塌了)。Sun 公司最大的资产,便是 Java。从此 Java 商标被 Oracle 收入囊中,才有了后来的 Oracle PK Google 大战 |
2017.08 | Oracle 将Java EE(Java SE 还自己保留)交给开源组织,Eclipse 基金会接手。但 Oracle 不允许开源组织使用 Java 名号,所以 Jakarta EE 名称于 2018.02.26应运而生 |
JSR, JCP …
- JSR 是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。
- JCP, Java Community Process,Java 社区进程,JCP维护的规范包括J2ME、J2SE、J2EE,XML,OSS,JAIN等。组织成员可以提交JCR(Java Specification Requests),通过特定程序以后,进入到下一版本的规范里面。