JDK和JRE到底是什么,JAVA EE 和 JAVA SE的区别

干了这么久的后端开发程序员,回首想想当初为什么选择了Java,还真说不上来原因,好像顺其自然的上学学到了,好像顺其自然毕业找到了一份Java开发的工作,一干就到现在,Java这门经久不衰的语言到底何去何来,我自己也没有什么123可说的,于是还是加班之余(此处应有滑稽表情)做了一些了解和总结。

一、Java是什么

Java是什么,大家好像觉得这不是一个问题,Java就是一门面向对象的编程语言呗。Java是一门编译语言不假,但实际上它的价值早已超过作为一门语言那么简单了,客观上说,它已经逐渐演变成了一个技术体系,一个提供了完整的用于日常跨平台开发和跨平台部署的技术体系。

二、Java技术体系

1.Java技术体系组成

Java技术体系都包括什么呢,我们先想一想一个Java程序的执行过程,当我们编辑并运行一个Java程序时,首先需要使用文字编辑软件或集成开发环境在Java源文件中定义不同的类(.java文件),然后在这些类中书写给人看的代码,接着我们需要把源文件编译生成一种二进制中间码,存储在class文件中(.java文件被编译成了给虚拟机看的.class字节码文件),然后再通过运行与操作系统平台环境相对应的Java虚拟机来运行class文件,执行编译产生的字节码,调用class文件中实现的方法来满足程序的Java API调用,如果需要,我们还可能引入调用第三方提供的JavaAPI。

所以,我们可以总结一下,Java技术体系大致应该包括:Java编程语言(起码可以叫人编码开发)丰富的Java类库API(毕竟大部分程序员都喜欢找封装好的API拿来就用,另外个人感觉也是提供了一个较为统一的API规范)Class文件格式(人来开发,但是还需要一个翻译给翻译成虚拟机能看懂的字)Java虚拟机(废话,真正干活的就是它)。比较官方的说法由JCP(Java Community Process的简写,是一个开放的国际组织,主要由Java开发者以及被授权者组成,职能是发展和更新)提出的定义Java技术体系包括以下几部分:

  • Java程序设计语言
  • Java虚拟机
  • Class文件格式
  • Java类库API(其中可以包括Java本身的API和第三方Java类库API)

2.Java技术体系组成划分

(1)对于Java技术体系,如果我们按照各个组成部分的功能来划分的话,还可以将其分为两大部分:JDKJRE

JDK(Java Development Kit):直接翻译过来就是Java开发工具包,JDK是用于支持Java程序开发的最小环境。简单说就是程序员日常开发需要的一个环境,那么我们日常开发需要什么呢?Java程序设计语言、Java虚拟机、Java类库,以上三个便是组成JDK的必要部分。

截自Jdk 8 中的 README 自述文件

JRE(Java Runtime Environment):直接翻译过来就是Java运行时环境。当我们对一个类或一个系统开发完毕,将其编译成字节码或打成jar包时,这时候我们的任务就完成了,接下来运行程序的话需要Java虚拟机运行,虚拟机在运行程序的时候还需要一些基础类库。所以JRE由Java虚拟机和Java类型API组成(这里细说的话,其实是Java SE中的所有类库)。

截自Jre 8 中的 README 自述文件
总结:
1.JDK = JRE + Java开发工具
2.你要想开发的话需要JDK,如果你只是想运行一个编译好的.class文件时,只需要JRE

说道这里,我们再一起看看当我们在操作系统(以windows举例)安装了JDK之后,安装文件夹下边都有些什么东西。

当然,这是我早就装好了的,可以看到包含jdk和jre两个文件夹。那先看看jdk中都有些什么:

一个个的分别来说一下,bin目录里面存放了JDK的各种工具命令即JDK开发工具的可执行文件其中这些可执行文件都是二进制的,其中包括编译器、解释器以及其他一些工具,比如我们刚开始用的Javac、Java命令去检查JDK是否安装配置正确就是在这个目录下面的命令。bin目录下的内容如下图:

include目录里面是一些供C语言使用的标题文件,其中C语言的头文件支持Java本地接口和Java虚拟机调试程序接口的本地编程技术。这里头文件的作用是让Java调用C/C++实现的函数功能。include目录下的内容如下:

jre目录路径下安装的就是运行Java程序所必须的JRE环境。我们可以看到在jre目录下的bin里面有java.exe、javaws.exe,但没有javac.exe。jre目录下的内容如下:

lib目录:该路径下存放的是JDK工具命令的实际执行程序。lib目录下的内容如下:

src.zip目录:该压缩文件里面存放的就是Java所有核心类库的源代码。src.zip目录解压内容如下:

那么和jdk同级的jre文件下有什么呢,内容如下:

好像和jdk文件夹下的jre的内容一样。诶?等等,为什么已经有个单独的jre文件夹,jdk里还要加个jre问价夹呢?jdk文件夹下的jre和与jdk同级的jre有什么区别呢?接下来我们先说说这个。

其实jdk里面的jre一般用于运行java本身的程序,比如javac等可执行程序,而和jdk同级的jre是用于运行用户编写的java程序。简单来说就是JDK里的工具几乎是用Java所编写,所以也是Java应用程序,因此要使用JDK所附的工具来开发Java程序,也必须要自行附一套JRE才行。那么当在执行java.exe的时候,怎么知道要使用哪个jre呢,操作系统寻找JRE的方式如下:

  •  先找当前目录下有没有JRE
  • 再找父目录下有没有JRE
  • 接着在PATH路径中找JRE
  • 注册表HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\ 查看CurrentVersion的键值指向哪个JRE

所以,当执行jdk\bin\java.exe的时候,用的jre是bin的父目录jdk下面的jre,而运行\jre\bin\java.exe的时候,用的则是与jdk同级的jre,并且当java.exe找到了对应的jre之后还有一个验证程序,验证jre和java.exe的版本是否一致,如果不一致也会发生错误。这也是我们在安装JDK时会在操作系统的环境变量里配置Path。当我们在之后文章中了解了jvm之后,在将java代码整个的运行过程串一遍,会清晰很多。

(2)言归正传,如果按照技术服务的领域或者按照技术关注的重点业务来划分,Java技术体系可以分为以下几个产品线:

  • Java Card:支持Java小程序(Applets)运行在小内存设备(如智能卡)上的平台。
  • Java ME(Micro Edition):支持Java程序运行在移动端的平台,及JDK6之前的J2ME,虽然Android主要使用Java语言开发,但是Android并不是属于Java ME的。
  • Java SE(Standard Edition):支持桌面级应用的Java平台,提供了完整的Java核心API,比如java.*包下的API,另外这也是为什么说组成JDK的Java类库API来自于Java SE了。
  • Java EE(Enterprise Edition):支持使用多层架构的企业应用的Java平台,除了包括Java SE的API之外,还做了大量针对性的扩充,比如javax.*包下的API。

网络上普遍认为javaME就是用来开发嵌入式的,javaSE就是用来开发桌面的,javaEE就是用来开发企业端的。这也许没错,但是为什么我们采用SSH框架和SSM框架的时候使用的是javaEE的技术,为什么下载的是jdk就可以了呢。

  • JDK不分ME,SE,EE,他们都是对Java即JDK的一种封装和规范。

  • 下面引自: http://javaligang.blog.51cto.com/5026500/1825681
    Java刚开始的时候,因为各种应用和生态不成熟,很多东西需要有人牵头制定强制规范引导Java的发展,于是Java EE曾经引领了企业级应用的开发。
    但随着时代的进步,以及越来越多的公司和组织参与到Java世界,出现了各种各样的Java EE组件的代替者,比如Hibernate、Spring就是其中两个典型。相反,Java官方制定的各种Java EE规范反而不太受欢迎,他们制定了JSF规范,但实际企业开发喜欢用Struts 2、Spring MVC;他们制定了EJB规范,但实际企业开发往往还是喜欢用Spring;他们制定了JPA规范,但实际企业开发往往还是喜欢直接用Hibernate、MyBatis。
    现代企业级应用常用的各种框架和工具,比如Struts 2、Spring、Hibernate、jBPM、Activiti、Lucene、Hadoop、Drools、CXF等这些大家耳熟能详的组件,全部都不是来自Oracle官方,但是却在企业应用中开发经常用到的。
    现在企业里面,真正常用的Java EE规范有什么?Servlet、JSP、JMS、JNDI。这些技术都只是充当了一个程序的入口而已。
    Oracle之所以可能考虑放弃Java EE,正体现了Oracle对丧失Java控制权的无奈。企业的本质是逐利,Oracle每年为制定Java EE规范投入不少人力、财力,但制定的规范最终并没有获得市场的青睐,所以Oracle可能放弃这种吃亏不讨好的事情。
    但Java不同,2016年6月,Java在商业语言排行榜上的市场份额将近21%,庞大到恐怖的市场份额,背后隐藏着巨大各种专利使用费和盈利商机,任何一个理智的公司都不会放弃这个会下金蛋的母鸡。

由此可见,oracle上提供的java EE是官方指定的javaEE规范,里面都是符合官方指定的javaEE组件,我们用SSM,SSH开发后台时使用到的只有Servlet、JSP、JMS等少量的java EE规范,没有必要使用orcale提供的java EE版本,直接使用jdk就可以当然还需要maven等管理第三方的jar包来实现功能。所以,无论是JavaEE还是JavaSE都只是oracle将自己的JDK再次封装,提供的一个比较成熟的解决方案或标准,类似于Spring,只不过是Java EE变得越来越被动。

 

附:下面为一个较为完整的Java技术体系所包含的内容的图:

 

最后,思考几个小问题,看看是否已经掌握了:

1.什么是JAVA SE 、EE、ME?

2.什么是JDK、JRE?

3.JDK中都包含什么?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章