一、Overview的设置
双击server面板中的Tomcatv7.0 Server,出现的Tomcat v7.0 Server的Overview配置,如下图:
1、Server Locations配置有三个选项:
1. Use workspace metadata (does not modifyTomcat installation);
2. Use Tomcat installation (take control ofTomcat Installation);
3. Use Custom location (does not modifyTomcat installation);
第一个选项表示使用当前workspace的metadata路径,它会将输出文件保存至workspace目录下一个很深的路径下;
第二个表示输出文件保存至tomcat安装目录下;
第三个是自定义一个路径。
除此之外,此选项下面还有两个参数输入框:
1. Server path(即tomcat或者eclipse根目录)
2. Deploy path(工程文件的发布目录,如果选择第二个选项“Use Tomcat installation”,一般为webapps。如果选择第一个选项“Use workspace metadata “一般为wtpwebapps)。默认是第一个选项,在Eclipse的Workspace\.metadata文件夹中,路径特别深,所以想查看文件特别麻烦。实际使用中一般选第二项Use Tomcat installation,以方便对Tomcat的控制。如果Tomcat服务下已经有工程了,需先将Tomcat服务下的工程全部移除(remove all),右键点击 clean命令,最后才能修改此项配置。
哪Eclipse是通过什么方式指定Tomcat的Server path和deploy path的呢?点击open launch configuration,可以看到如下信息,这张是Use workspace metadata 的启动参数:
这张是Use Tomcat installation的启动参数:
2、Server Options配置详解:
(1)Serve modules without publishing
这个选项勾上后,Tomcat会直接使用Eclipse工程下WebContent下的东西,省去publish到Tomcat服务器webapps目录或Eclipse workspace空间的wtpwebapps目录(取决于前面ServerLocations的配置)的工作。这个功能通过修改Tomcat安装目录的/conf/server.xml中的<Context>配置实现的,可以发现<Context>的docBase指向了Eclipse工程项目的WebContent,示例如下:
不勾选Serve modules without publishing时,Server.xml的<context>内容:
<Context docBase="PostAndGet" path="/PostAndGet1" reloadable="true" source="org.eclipse.jst.jee.server:PostAndGet"/>
勾选Serve modules without publishing后,Server.xml的<context>内容:
<Context docBase="C:\Documents and Settings\Administrator\workspace\PostAndGet\WebContent" path="/PostAndGet1" reloadable="true" source="org.eclipse.jst.jee.server:PostAndGet">
<Resources className="org.eclipse.jst.server.tomcat.loader.WtpDirContext" extraResourcePaths="/WEB-INF/classes|C:\Documents and Settings\Administrator\workspace\PostAndGet\build\classes" virtualClasspath="C:\Documents and Settings\Administrator\workspace\PostAndGet\build\classes"/>
<Loader className="org.eclipse.jst.server.tomcat.loader.WtpWebappLoader" useSystemClassLoaderAsParent="false" virtualClasspath="C:\Documents and Settings\Administrator\workspace\PostAndGet\build\classes"/><JarScanner scanAllDirectories="true"/>
</Context>
(2)publish module contexts to separate XML files
勾选上后会使本来配置Tomcat安装目录下的conf/server.xml里的<context>元素,separate到conf/Catalina/localhost/的目录下,专门生成一个{context_name}.xml。
(3)Modules auto reload by default
勾选上后,每次将项目发布在Tomcat服务器上时,Tomcat会缺省(by default)自动在server.xml文件中的<Context>元素中增加reloadable=“true”,让项目在不重启Tomcat服务器的情况下自动具有reload的属性。
3、Publishing:
当我们编译好了一个项目后,如果内容产生了变化,我们一般是要手动点上图红圈中的Publish to Server,将项目内容和Tomcat服务项目的配置发布到服务器上去,当然系统可以自动完成这个工作,这三个选项就控制自动发布工作的。第一个是不自动发布,第二个是资源有变化时发布,第三个是编译后过多少秒发布。如果之前在Server Options配置选择了Serve modules withoutpublishing,哪这三个选项就没有意义了,因为已经自动指向了工程的WebConten目录,无需发布。
Updatecontext paths,是更新应用的WEB访问路径。当你使用eclipse开发,右击项目选择属性,找到Web Project Settings,修改了context root的属性的话。如果你勾选了Update context paths,系统就会提示你要不要更新Tomcat配置,如果选了是,Tomcat就会在conf/servers.xml中的Context元素中将path设置为你更改了的context root值。
4、Timeouts
在启动Tomcat Server时,经常会出现启动时间过长的错误,如果启动的时间超过了Start(in seconds)设置的值,就会报错。如下图(为方便截图设为1s):
Stop(in seconds)为Tomcat Server停止的超时时间。如果在设定的时间没有停止,就会弹出下图的提示服务没有响应。
二、Tomcat服务使用中的各种问题。
1、Eclipse中的Tomcat服务
在Eclipse中增加了一个Tomcat服务器后,在Project Explorer中会增加一个Servers的工程,这个工程管理我们的Tomcat服务器,下面的3个xml文件对应Tomcat的conf目录下的三个文件,但不是直接把这三个文件覆盖Tomcat安装目录下的三个对应文件,如何要研究Tomcat的动作机制还是要直接去找Tomcat的conf目录下的文件。
2、开启auto reload,避免服务器重启。
(1)设置项目的Auto reloading功能
勾选了这个选项,就会在Server.xml文件中将<Context>元素中加上reloadable=”true“这个属性。如果在Server options中选择了Modules auto reload by default则每次将项目发布在Tomcat服务器上时,会默认加上reloadable=“true”属性。
(2)关闭当需要时重启服务器选项。
虽然设置了reload=“true“,但每次对servlet进行更改都提示要重新启动服务器,如何解决?
点击菜单栏,Window->Preferences->Server->Launching,在下图高亮的地方选择Never,就可以了。这样的话,系统就不会提示服务器重启,而是在项目发生更改保存后,在几秒内reload,控制台会打出
信息: ReloadingContext with name [/项目名] is completed
3、开启auto reload,启用Debug模式的hot swap,避免服务器reload。
虽然服务器reload比restart要方便一点,但是每次reload也麻烦,尤其是改动很频繁的时候。网上很多人误解热部署和热加载的概念,所以造成乱配置的行为,这里提示一下.
热部署:就是容器状态在运行的情况下部署或者重新部署整个项目.在这种情况下一般整个内存会清空,重新加载.简单来说就是Tomcat或者其他的web服务器会帮我们重新加载项目.这种方式可能会造成sessin丢失等情况。之前配置的reload=”true”就是这种情况。
热加载:就是容器状态在运行的情况下重新加载改变编译后的类。在这种情况下内存不会清空,sessin不会丢失,但容易造成内存溢出,或者找不到方法。因为内存无法转变成对像.。一般改变类的结构和模型就会有异常,在已经有的变量和方法中改变是不会出问题的。在Eclipse的Debug模式中就支持热加载,采用的是JVM hot swap技术。“HotSwap”是JPDA(Java Platform Debugger Architecture)中的一个特性,JDK1.4以后才有的新功能。HotSwap允许将JVM中的类定义替换为新的类定义,这就允许开发人员在debug时,将修改过的class替换JVM中旧有的class,无需重新启动服务器。不过,目前HotSwap只支持对方法body的修改,不支持对类和方法签名的修改(比如修改类名,方法名,方法参数等)。考虑这些限制,也是有理由的,替换类定义,就需要新类和旧类之间有一个关联,这里关联就是类的全名(或许还有其他信息),类名都改了,就不知道替换哪个类了。至于方法签名的修改,应该是考虑到运行时方法的调用,通过方法签名替换已有的方法调用。
为了达到这种效果,按前面的图示,找到 “Servers” 模块(通过 Window -> Show View -> Servers打开). 双击里面的server 实例进入配置界面. 里面有两个标签页, Overview和Modules, 点击Modules, 找到相应的Project, 并点击Edit, 在“Autoreloading enabled”旁边取消勾选 就可以通Debug As 来运行程序了,现在Tomcat服务器就不会自己reload了。但是注意类不可以增加方法,否则会报错如下图,如果增加了方法可以重启一下服务。
4、为什么debug as 或者run as 后,内置的浏览器看到的不是最新修改的结果,要刷新一下才可以?
原因为内置的浏览器使用的是IE的内核,采用了缓存机制。需要打开IE浏览器,找到Internet选项,将“检查存储的页面的较新版本”,由自动改为“每次访问网页时”。