Java是什么,大家好像觉得这不是一个问题,Java就是一门面向对象的编程语言呗。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技术体系包括以下几部分:
JDK(Java Development Kit):直接翻译过来就是Java开发工具包,JDK是用于支持Java程序开发的最小环境。简单说就是程序员日常开发需要的一个环境,那么我们日常开发需要什么呢?Java程序设计语言、Java虚拟机、Java类库,以上三个便是组成JDK的必要部分。
JRE(Java Runtime Environment):直接翻译过来就是Java运行时环境。当我们对一个类或一个系统开发完毕,将其编译成字节码或打成jar包时,这时候我们的任务就完成了,接下来运行程序的话需要Java虚拟机运行,虚拟机在运行程序的时候还需要一些基础类库。所以JRE由Java虚拟机和Java类型API组成(这里细说的话,其实是Java SE中的所有类库)。
总结:
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的方式如下:
所以,当执行jdk\bin\java.exe的时候,用的jre是bin的父目录jdk下面的jre,而运行\jre\bin\java.exe的时候,用的则是与jdk同级的jre,并且当java.exe找到了对应的jre之后还有一个验证程序,验证jre和java.exe的版本是否一致,如果不一致也会发生错误。这也是我们在安装JDK时会在操作系统的环境变量里配置Path。当我们在之后文章中了解了jvm之后,在将java代码整个的运行过程串一遍,会清晰很多。
网络上普遍认为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技术体系所包含的内容的图: