Advanced Java-01-JDK

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
-Djava.util.logging.config.file=/data0/tomcat/tomcat_8080/conf/logging.properties
-Xms2048m -Xmx2048m -XX:MaxPermSize=256m
-classpath /data0/tomcat/tomcat_8080/bin/bootstrap.jar:/data0/tomcat/tomcat_8080/bin/tomcat-juli.jar -Dcatalina.base=/data0/tomcat/tomcat_8080 -Dcatalina.home=/data0/tomcat/tomcat_8080 -Djava.io.tmpdir=/data0/tomcat/tomcat_8080/temp
org.apache.catalina.startup.Bootstrap start

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

区别与联系

Oracle与OpenJDK之间的区别 - 掘金

免费 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的方案:

关于 Oracle的许可协议:

  • Oracle JDK 的许可协议有两种:
    • BCL(Oracle Binary Code License Agreement): 个人/开发使用免费,商用免费(但商用免费仅限于”通用计算”设备, 移动设备/嵌入式设备不包括在免费领域)。JDK中的某些商业特性(使用-XX:+UnlockCommercialVMOptions打开的特性)仍是需要付费才可以使用的;
    • OTN(Oracle Technology Network License Agreement): 个人/开发使用免费,商用收费;
  • 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),通过特定程序以后,进入到下一版本的规范里面。

Java EE跟JCP说再见-InfoQ