给java初学者关于jdk jre eclipse tomcat jetty 的疑惑的说明

来源:互联网 发布:python bytes函数 编辑:程序博客网 时间:2024/06/18 03:20

 问题:Java初学者首先下载 JDK 开发环境,然后再下 eclipse 对吗?那 tomcat是什么?还需要安装吗?

=====================分割线========================================================

这个问题,作为有些Java经验的人,都会觉得太初级。而且,我认为可能很多真正的高手不屑于跑来回答这种问题。
本来我也不打算回答的,但最近刚好凭兴趣在学Node.JS,顺便学习加强一下Vim。发现什么Coffee Script、什么Jade、什么Express之类的还真是让人一头雾水。深刻地认识到很多基础的东西,如果没有个人来串一下,对于初学者来说还真是麻烦。
所以,我觉得还是来回答一下比较好。(是不是太罗嗦了?)

===== 正文分割线 =====
JDK是Java Development Kit,也就是说Java开发所需的工具包。有了这个东西,一切Java开发理论上都不是问题了。当然,根据你下载的版本不同,可能擅长的领域不同。通常大家都是用JDK来开发JavaSE应用的。
具体做法上,JDK里包含了用来编译源代码的javac命令,和用来执行字节码的java命令。
只要设好了所用操作系统的PATH和CLASSPATH两个环境变量,对你所写的文本格式的Java源代码进行操作,原则上就不会出现代码编写问题以外的错误。
但因为javac和java命令都是命令行命令,执行以及结果查看都有些麻烦。更麻烦的是代码的动态调试(也就是一边跑一边看每一步都做了什么)。

Eclipse是集成开发环境,就是解决上面说的命令执行和操作麻烦的问题的。使用这个工具,如果你不做什么特别的特殊的事情的话,你可以不用操心javac和java命令怎么用,参数是什么,各种环境变量如何配置等。
只需要按照教程学会工具的使用,就可以很容易地书写你的代码,然后进行编译、执行以及调试。
而且,代码书写时会有很多提示,不用去记各个Class那些庞杂的方法名等。
也正是因为方便,它会在一定程度上影响你对Java相关命令的学习以及对常用Class的掌握。毕竟重复是加强记忆的最佳途径。什么都提示了,都自动了,就很难记住了。
这就是为什么有人反对你一开始使用这工具。

至于tomcat,它是使用Java进行Web开发的应用服务器(Application Server)软件。
之所以它会跟Java有紧密的联系是因为Java在经历了诞生后的进化之后,渐渐地被大众接受为优良的Web服务器端编程语言,也就是说Java最能发挥其优势的地方是用来进行Web开发。
从你的问题描述,我冒昧地认为你可能不是太了解什么是Web开发。所以简单做一下解释。
Web开发,说白了就是网站构建的软件部分。我们每天上网,看到各种网页,这些网页大多数都是由服务器端的程序根据用户提出的请求生成出来。这些程序就是服务器端运行的程序。
而服务器与浏览器的沟通是通过特定的格式进行的,这个格式被称作HTTP协议,HTTP协议有很多内容需要处理,如果所有这些都由开发者来做,未免负担过重。所以,很多年以前就有人开发出了专门的应用程序服务器软件,专门负责处理HTTP协议中的细节部分,而把真正需要的处理发送给专门的程序,也就是Web开发的程序。
以Java为例——
所有的Java程序启动入口都是public static void main(String[] args)函数。tomcat里面就有这么一个函数,运行这个函数后,tomcat里面会进行各种处理——打开网络端口进行监听、加载HTTP解析模块……我们称作服务器启动了。(实际是跟Apache协作进行的,这里就不详述了。)
当从网络上有请求到达我们的tomcat服务器时,它会根据请求的地址来调用你写的java程序模块。
比如,让我们先假设知乎的后台是Java实现的。
当你敲入
zhihu.com/
的时候,tomcat会得到一个希望访问/(根目录资源)的请求。
然后它去配置文件里查根目录对应的模块是什么。
假设查到的模块是root这个类
那么它会去调用root.doGet()方法。
而你写一个Servlet的时候,必须实现doGet()方法,此时你的方法被调用,那么你写的代码就运行了。

大概就是这么个状况。

至于学习方法。因人而异。
如果你希望直接学习如何用Java来开发Web应用。建议在学习Java语言之前先简单学习一下网络基础知识。
至少理解以下几个基础概念(到维基百科上查查,读懂即可):

  • 服务器
  • 客户端
  • 协议
  • 端口
  • URL
  • TCP/IP
  • 网络分层结构(了解概念即可,暂时不需要记住各层是咋回事儿)
  • 浏览器
  • HTTP(需要理解GET/POST的意义、差别)
  • HTML
  • Session(会话)

然后再开始Java进行Web开发的学习。


======================================================================================


首先是JDK和JRE的区别。

严格的说,JDK是给java开发者用的,你需要用jdk提供的工具来编译你的程序,打包你的程序。因此,JDK就如同它的名字一样,是一个开发者工具包。你可以将JDK直接类比为GCC。

至于JRE,提供的是Java的运行环境,可以简单理解为运行java程序所必须的所有依赖关系,可以将它类比为linux预先安装的so,或者windows下预安装的vc,vb运行库dll。

当然,JDK本身是包含一个JRE的,否则你光能编译你的程序也没法运行不是?

接下来,运行eclipse到底需要什么?答案是JRE可以用,但推荐用JDK。下面我来解释为什么。

eclipse本身是基于java实现的,因此,运行eclipse的最低限度条件,当然就是JRE。有了JRE,eclipse就能够启动,eclipse启动之后,会判断启动自己的JRE的安装位置,然后,将这个JRE作为默认的”installed jre“(Preferences->Java->Installed JREs)。接下来,我们在eclipse里面创建一个java工程,实际上,在这个时候,你需要指定你的java工程究竟使用那个jre,注意,这意味着,你的java工程实际上可以指定使用另外的JDK版本而不一定非要使用启动eclipse的jre。当然,在大多数情况下,尤其是对初学者来说,启动eclipse的jre就足够用了,暂时还没有到考虑多个jre版本的时候。

好了,这里就有一个疑问,JRE只提供了运行环境,但并没有提供编译java代码的能力,那eclipse怎么编译你的程序呢?答案是,eclipse自己带了一个java编译器,我们通常称为eclipse compiler,它将你的代码编译成java类文件,然后当你在eclipse里面启动你的程序的时候,eclipse会调用你的java工程绑定的jre来启动。不必担心eclipse的编译器和官方JDK提供的javac命令的区别,它是经过了官方认证测试的。

到这里为止,初学者的hello word已经可以运行了,think in java上的例子也都可以运行了。我们的学习者很开心,接下来,我们的学习者开始学习java web编程,这个时候,又遇到了一个新的疑问,究竟尼玛什么是Java EE SDK,我他妈需要在oracle的那个java下载网站上下载Java EE吗?官网上Java EE下面页面的那个GlassFish又是什么玩意儿?

首先说说Java EE,Java EE本身只是一个规范,你可以理解为一组API的约定,这个约定是经过JCP这个委员会(各大厂商组成,并不是oracle说了算)共同认可并发布的,然后有了这个约定,各大厂商就会各自分别去做自己的实现,然后拿去卖钱,比如IBM的Websphere,以及已经被oracle收购的weblogic。至于oracle,其实,那个时候还是sun吧,sun作为Java的母体公司,自然也会有自己的实现,这个就是GlassFish。当年Oracle还没有收购sun的时候,也有自己的实现,名字加啥来着,Oracle Application Server?好像是叫这个名字。这些实现呢,有些是要花钱的,有些是免费的,无论收费免费,总之,各大厂商自然都有自己的商业利益在上面。

接下来,就该说说开源界了,JCP发布了规范,各大厂商各自做了实现,开源界也不甘示弱,于是有了Tomcat, jetty, jboss, resion等等等等同样遵循Java EE规范的开源实现。

这时候看出来Java EE的作用了吗?你看,我可以在开发的时候用Tomcat或者Jetty,因为是开源的嘛,各种工具也趁手,但是到了线上环境,我可能还是对开源软件心存疑虑,所以我决定还是付费买个有技术支持的平台比较好,然后我找到了IBM的销售,来,给大爷来个websphere,3年24小时技术支持的干活。当然,我这里只是打个比方,事实上现在互联网公司一般都是在线上用tomcat或者jetty的。总之,Java EE的作用就是,你不必被绑定在特定厂商身上,Tomcat不好用,换Jetty,IBM破产了,还有oracle(打个比方,打个比方)。

好了,言归正传,上面的说明已经可以看到了,我们不需要在oracle的官网上下载Java EE这个东西,oracle官网提供的,只是Java EE的官方参考实现GlassFish,但我们完全可以选择开源的Tomcat或者Jetty,这个就是大宝啊,我们都用它。

好了,我们的学习者终于明白了这个关系,去下载了一个tomcat,慢着,我咋在eclipse的里面调用tomcat呢?

==先发出来,等我吃完饭回来接着写==
==吃完饭啦,好饱啊=============

eclipse ee那个下载版本,自带了一个tomcat的插件,具体怎么用,我这里不赘述,自己去查资料,简单的说,它也需要你告诉它,你下载的tomcat在哪儿。好了,我们的初学者下载了tomcat,解开了压缩,然后在eclipse指定了tomcat的安装目录,按照向导建立了自己的第一个web程序,启动,哎呀,报错了。。。tools.jar not found!

这是什么玩意儿?tools.jar是jdk提供的一个工具包,tomcat也依赖这个包来编译jsp,虽然我们的eclipse已经有了一个编译器,但是很不幸tomcat并不知道这个事情,所以,它只好委屈的报错了。这个时候,就是我前面说到的,为什么推荐用jdk了。好了,对这个问题,我们有两个解决办法,第一,虽然你是用jre启动的eclipse,但我们可以告诉eclipse,这里还有另外的jdk可以用,preference->java-installed JREs,添加一个新的jdk(eclipse这里统一用了jre这个单词,但实际上,jdk也是在这里管理),指向你的jdk的安装目录,然后,把你的工程绑定的jre重新指向你新添加的这个jdk,就可以了。第二个办法,就是一开始就用jdk来启动你的eclipse而不是jre,这样,你的eclipse的缺省jre环境就已经是jdk,对初学者来说,也许更加省事。这就是为什么我前面说推荐用JDK的原因。怎么用jdk启动eclipse?看到eclipse安装目录下有个eclipse.ini文件么?notepad打开,加入下面两行:

-vmC:\jdk1.7.0_21\bin\javaw.exe 
详细参看这里:eclipse.ini - Eclipsepedia

最后,初学者用eclipse的tomcat插件,经常会发现自己的修改不起作用啊,不起作用啊,非得重启不可啊。。。因为,eclipse的tomcat插件根本就是个残废好不好。。。到网上一搜,一般的答案是,你需要deploy你的工程,你修改的jsp才能生效,你还需要诸如jrebel这样的工具,才能让修改后的java代码实时生效,是吧,我相信,初学者到这里已经疯了,又有新名词了,deploy是什么意思,jrebel是什么。。。。

好吧,我这么多年,从来不用tomcat插件,也从来不用jrebel这样的工具,但我从来不需要deploy我的工程,我的jsp就能实时生效,也从来不需要重启,我的java代码的修改就能立即反应,OK,很羡慕是吧?我要是说就不告诉你,会不会被打死?

首先,这个世界上有个插件叫做runjettyrun,如同它的名字,它是一个jetty插件而不是tomcat插件,记得我们前面说的吗,jetty和tomcat都是按照Java EE规范实现的,所以,你不必担心兼容性的问题,你的代码是面向Java EE规范编程,不是面向jetty或者tomcat编程。OK,用这个插件你不必每次修改jsp之后都要deploy,修改,保存,刷新浏览器,你就可以看到你的修改生效了。

(RJR只支持单个web工程,我曾经有项目需要同时启动数个web工程进行相互通讯,这个时候,我用的是自定义的tomcat启动配置,同样没有使用ec的插件,自力更生,简单好用)

然后,是java代码,对于java代码的热替换有无数工具来帮助你,但是,但是啊,我们根本不需要这些工具好不好!java hotspot虚拟机本身就支持热替换好不好!当然,java hotspot的代码热替换,跟jrebel之类的工具能够提供的能力,还是有些差距的,但是,我觉得既然90%的case我都不需要重启了,剩下的10%偶尔重启一下,其实也不是什么不能忍受的事情不是,至少可以少引入一个工具,少一个麻烦。那么,怎么做?

首先,你要以debug模式启动而不是run模式,嗯,养成习惯,我从来不用run模式启动我的程序。然后,在debug模式下启动之后,hotspot会在每次new一个新实例的时候,检查class文件有没有变化,然后重新加载修改后的class文件,意思就是,你刷新页面,看到页面上有个输出不对,转到eclipse,修改java代码,保存,然后,再刷新页面,OK,修改生效了。

接下来,有人会说,你胡说呀,我修改了java代码,然后保存,根本不生效啊,不生效啊,不重启根本不生效啊。是的,你没看错,就是不生效,但这不是我的错啊,你使用的框架可能会缓存类实例,典型的比如spring管理的bean,缺省都是singleton的,java没有机会重新加载你修改过的类文件啊。再问一次,怎么办?

两个办法,第一个,以spring为例,你需要一个判断逻辑,在开发模式的时候,将所有的bean的scope都声明成prototype模式而不是singleton,怎么判断开发模式和线上模式?自己动脑筋去想吧。spring怎么配置不同的scope?自己去查spring的资料吧。你没有权限修改项目的配置?初学者看不懂,表示茫然?没事,看下面第二个办法。

第二个办法,可以算是一个奇巧淫技。你看,我修改了代码,保存了,没生效,咋办呢?我们先来设置一个断点,在你修改的那个方法的第一行,记住,最好是第一行,然后刷新浏览器,后台eclipse停在断点处了,这个时候,你可以在这个方法内部,随便加两行代码,比如System.out.println()之类的,然后保存,然后你会发现,奇迹出现啦,eclipse会眨眨眼,闪两闪,断点的高亮提示重新出现在方法的第一行,这个时候你如果不需要单步调试的话,F8让断点继续执行,OK,回到浏览器看看,修改已经生效了。这个方法的问题是,如果你修改的代码太多,等你回过头去加断点的时候,可能行数已经不对了,所以我一般的办法是,先加断点,等断点停下来了,我再来改代码,改好了,保存,断点重入,F8继续,OK,搞定收工,一气呵成。

补充说明就是,利用hotspot的代码热替换功能是有局限性的,你不能修改方法的签名,比如改变方法名,改变方法返回值,改变方法的参数声明等等,出现这种情况,hotspot会报错,eclipse也会弹出错误对话框,这个时候你就只能选择重启了。

好了,接下来,就需要说明maven啊,ant啊之类的玩意儿了,怎么打包啊,怎么发布啊,这些我就不说了,作为初学者能学到这一步,剩下的那些东西,自己看看网上的资料,也应该都能看得懂啦。



作者:p0p0p0p01


原创粉丝点击