﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-SIMONE-随笔分类-tomcat</title><link>http://www.blogjava.net/wangxinsh55/category/24824.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 18 Jul 2016 08:51:56 GMT</lastBuildDate><pubDate>Mon, 18 Jul 2016 08:51:56 GMT</pubDate><ttl>60</ttl><item><title> 使用embeded tomcat进行嵌入式javaee开发－启动tomcat</title><link>http://www.blogjava.net/wangxinsh55/archive/2016/07/18/431229.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Mon, 18 Jul 2016 06:42:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2016/07/18/431229.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/431229.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2016/07/18/431229.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/431229.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/431229.html</trackback:ping><description><![CDATA[<div>https://www.iflym.com/index.php/code/use-embeded-tomcat-to-javaee-start-tomcat.html</div><br /><div>昨天在网上研究了下关于将tomcat嵌入到主程序中进行运行，而不是像以前将一个web项目copy到tomcat中进行运行。之所以这样做的原 因，即是因为项目部署到客户方，在进行更新的时候，需要手动地进行更新，再把相应代码copy到tomcat，然后再运行。运用embeded  tomcat就可以将项目与tomcat分开，在进行更新时，先使用自定义的程序进行自动化更新，待更新完毕之后，再启动tomcat（或其它 javaee容器）进行项目运行。 <p> </p><p> 	 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样做的最终效果就是修改了项目的运行方式。原先的运行方式是以tomcat为中心，由tomcat来启动和终止项目，现在是由我们的启动程序 为中心，由启动程序来负责启动和终止项目。就相当于现在流行的cs程序一样，有单独的启动脚本，在启动时进行环境预初始化，更新程序以及其它操作，待完成 之后再进行最终的项目启动。</p> <p> 	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这篇主要讲解如何使用embeded  tomcat在代码中进行启动和终止。网上的一般文章均为tomca5.x来做，这里使用了最新的tomcat7，因为tomcat7为embeded开 发，单独发布了org.apache.tomcat.embed包，以进行独立的embed开发。以下是相应的maven包</p> <div><div id="highlighter_270301"  xml"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">01</div><div number2="" index1=""  alt1"="">02</div><div number3="" index2=""  alt2"="">03</div><div number4="" index3=""  alt1"="">04</div><div number5="" index4=""  alt2"="">05</div><div number6="" index5=""  alt1"="">06</div><div number7="" index6=""  alt2"="">07</div><div number8="" index7=""  alt1"="">08</div><div number9="" index8=""  alt2"="">09</div><div number10="" index9=""  alt1"="">10</div><div number11="" index10=""  alt2"="">11</div><div number12="" index11=""  alt1"="">12</div><div number13="" index12=""  alt2"="">13</div><div number14="" index13=""  alt1"="">14</div><div number15="" index14=""  alt2"="">15</div><div number16="" index15=""  alt1"="">16</div><div number17="" index16=""  alt2"="">17</div><div number18="" index17=""  alt1"="">18</div><div number19="" index18=""  alt2"="">19</div><div number20="" index19=""  alt1"="">20</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">&lt;</code><code keyword"="">dependency</code><code plain"="">&gt;</code></div><div number2="" index1=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;</code><code keyword"="">groupId</code><code plain"="">&gt;org.apache.tomcat.embed&lt;/</code><code keyword"="">groupId</code><code plain"="">&gt;</code></div><div number3="" index2=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;</code><code keyword"="">artifactId</code><code plain"="">&gt;tomcat-embed-core&lt;/</code><code keyword"="">artifactId</code><code plain"="">&gt;</code></div><div number4="" index3=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;</code><code keyword"="">version</code><code plain"="">&gt;7.0.2&lt;/</code><code keyword"="">version</code><code plain"="">&gt;</code></div><div number5="" index4=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;/</code><code keyword"="">dependency</code><code plain"="">&gt;</code></div><div number6="" index5=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;</code><code keyword"="">dependency</code><code plain"="">&gt;</code></div><div number7="" index6=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;</code><code keyword"="">groupId</code><code plain"="">&gt;org.apache.tomcat&lt;/</code><code keyword"="">groupId</code><code plain"="">&gt;</code></div><div number8="" index7=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;</code><code keyword"="">artifactId</code><code plain"="">&gt;tomcat-util&lt;/</code><code keyword"="">artifactId</code><code plain"="">&gt;</code></div><div number9="" index8=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;</code><code keyword"="">version</code><code plain"="">&gt;7.0.2&lt;/</code><code keyword"="">version</code><code plain"="">&gt;</code></div><div number10="" index9=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;/</code><code keyword"="">dependency</code><code plain"="">&gt;</code></div><div number11="" index10=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;</code><code keyword"="">dependency</code><code plain"="">&gt;</code></div><div number12="" index11=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;</code><code keyword"="">groupId</code><code plain"="">&gt;org.apache.tomcat.embed&lt;/</code><code keyword"="">groupId</code><code plain"="">&gt;</code></div><div number13="" index12=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;</code><code keyword"="">artifactId</code><code plain"="">&gt;tomcat-embed-jasper&lt;/</code><code keyword"="">artifactId</code><code plain"="">&gt;</code></div><div number14="" index13=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;</code><code keyword"="">version</code><code plain"="">&gt;7.0.2&lt;/</code><code keyword"="">version</code><code plain"="">&gt;</code></div><div number15="" index14=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;/</code><code keyword"="">dependency</code><code plain"="">&gt;</code></div><div number16="" index15=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;</code><code keyword"="">dependency</code><code plain"="">&gt;</code></div><div number17="" index16=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;</code><code keyword"="">groupId</code><code plain"="">&gt;org.apache.tomcat.embed&lt;/</code><code keyword"="">groupId</code><code plain"="">&gt;</code></div><div number18="" index17=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;</code><code keyword"="">artifactId</code><code plain"="">&gt;tomcat-embed-logging-juli&lt;/</code><code keyword"="">artifactId</code><code plain"="">&gt;</code></div><div number19="" index18=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;</code><code keyword"="">version</code><code plain"="">&gt;7.0.2&lt;/</code><code keyword"="">version</code><code plain"="">&gt;</code></div><div number20="" index19=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">&lt;/</code><code keyword"="">dependency</code><code plain"="">&gt;</code></div></div></td></tr></tbody></table></div></div> <p> 	&nbsp;&nbsp;&nbsp;&nbsp;使用了embed包中的core包，以及用于编译jsp的jasper包，然后是工具类以及进行上场记录的logging-juli包。开始写代码：</p> <div><div id="highlighter_885343"  java"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div><div number7="" index6=""  alt2"="">7</div></td><td><div><div number1="" index0=""  alt2"=""><code comments"="">//设置工作目录</code></div><div number2="" index1=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">String catalina_home = </code><code string"="">"d:/"</code><code plain"="">;</code></div><div number3="" index2=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">Tomcat tomcat = </code><code keyword"="">new</code> <code plain"="">Tomcat();</code></div><div number4="" index3=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">tomcat.setHostname(</code><code string"="">"localhost"</code><code plain"="">);</code></div><div number5="" index4=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">tomcat.setPort(startPort);</code></div><div number6="" index5=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">//设置工作目录,其实没什么用,tomcat需要使用这个目录进行写一些东西</code></div><div number7="" index6=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">tomcat.setBaseDir(catalina_home);</code></div></div></td></tr></tbody></table></div></div> <p> 	 &nbsp;&nbsp;&nbsp;&nbsp;上面使用了Tomcat类来进行启动类，在tomcat7以前均是使用一个叫Embed类来进行启动，在tomcat7之后，embed类被不建 议使用，而建议使用新的Tomcat类来进行启动了。然后设置主机名，端口，再设置一个工作目录。这个工作目录可以是任意目录，主要是tomcat需要这 个目录来记录一些东西，比如记录word信息，日志信息（如果配置了日志的话），以及临时文件存储等。</p> <div><div id="highlighter_758113"  java"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div><div number7="" index6=""  alt2"="">7</div><div number8="" index7=""  alt1"="">8</div></td><td><div><div number1="" index0=""  alt2"=""><code comments"="">//设置程序的目录信息</code></div><div number2="" index1=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">tomcat.getHost().setAppBase(</code><code string"="">"e:/"</code><code plain"="">);</code></div><div number3="" index2=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">// Add AprLifecycleListener</code></div><div number4="" index3=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">StandardServer server = (StandardServer) tomcat.getServer();</code></div><div number5="" index4=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">AprLifecycleListener listener = </code><code keyword"="">new</code> <code plain"="">AprLifecycleListener();</code></div><div number6="" index5=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">server.addLifecycleListener(listener);</code></div><div number7="" index6=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">//注册关闭端口以进行关闭</code></div><div number8="" index7=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">tomcat.getServer().setPort(shutdownPort);</code></div></div></td></tr></tbody></table></div></div> <p> 	 &nbsp;&nbsp;&nbsp;&nbsp;上面的代码，首先设置我们的项目程序所在的appbase，即放项目代码的地方。在通常的tomcat配置中，这个目录一般是webapps。接 着设置一个listener，这个listener主要是负责启动一些比如html  native支持程序以及ipv6等信息配置（可以忽略）。接着是配置一个关闭的注册端口，当向这个端口发送信息时，就可以达到关闭tomcat的目的 （后面会讲）。</p> <div><div id="highlighter_58990"  java"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div><div number7="" index6=""  alt2"="">7</div><div number8="" index7=""  alt1"="">8</div><div number9="" index8=""  alt2"="">9</div></td><td><div><div number1="" index0=""  alt2"=""><code comments"="">//加载上下文</code></div><div number2="" index1=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">StandardContext standardContext = </code><code keyword"="">new</code> <code plain"="">StandardContext();</code></div><div number3="" index2=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">standardContext.setPath(</code><code string"="">"/aa"</code><code plain"="">);</code><code comments"="">//contextPath</code></div><div number4="" index3=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">standardContext.setDocBase(</code><code string"="">"aa"</code><code plain"="">);</code><code comments"="">//文件目录位置</code></div><div number5="" index4=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">standardContext.addLifecycleListener(</code><code keyword"="">new</code> <code plain"="">Tomcat.DefaultWebXmlListener());</code></div><div number6="" index5=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments"="">//保证已经配置好了。</code></div><div number7="" index6=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">standardContext.addLifecycleListener(</code><code keyword"="">new</code> <code plain"="">Tomcat.FixContextListener());</code></div><div number8="" index7=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">standardContext.setSessionCookieName(</code><code string"="">"t-session"</code><code plain"="">);</code></div><div number9="" index8=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">tomcat.getHost().addChild(standardContext);</code></div></div></td></tr></tbody></table></div></div> <p> 	 &nbsp;&nbsp;&nbsp;&nbsp;我们单独使用了一个Context来为这个host添加上下文，tomcat本身提供一个方法tomcat.addWeb方法来添加项目包，不过 由于这里需要单独设置一个tomcat的sessionName，所以使用与与tomcat.addWeb实现类似的方法来添加一个项目包。<br /> 	 &nbsp;&nbsp;&nbsp;&nbsp;以上代码中有两个需要注意的listener，一个是DefaultWebXmlListener，这个是由tomcat加载一些默认的配置信 息，比如jspServlet，以及一些繁复的mime/type信息；加上这个，就不需要我们自己去写这么多的配置，因为每个项目都需要这些。这个配置 与tomcat目录下的conf/web.xml中的配置一样，只不过这里是代码化了。第二个是FixContextListener，这个主要是在项目 部署完后，将这个上下文设置为configured，表示已经配置好了（不然，tomcat启动时会报错，即相应上下文还未配置好）。<br /> 	&nbsp;&nbsp;&nbsp;&nbsp;配置OK了之后，就是启动tomcat了：</p> <div><div id="highlighter_710437"  java"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">tomcat.start();</code></div><div number2="" index1=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">tomcat.getServer().await();</code></div></div></td></tr></tbody></table></div></div> <p> 	&nbsp;&nbsp;&nbsp;&nbsp;启动tomcat，并让tomcat在关闭端口上监听。如果没有最后一句，程序将直接结束，保证监听之后，tomcat将一直监听关闭事件，待有关闭事件之后才结束当前程序。所以如果想要关闭当前的tomcat，只需要向关闭端口发送一些信息即可：</p> <div><div id="highlighter_515098" java=""  "=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div><div number7="" index6=""  alt2"="">7</div><div number8="" index7=""  alt1"="">8</div><div number9="" index8=""  alt2"="">9</div></td><td><div><div number1="" index0=""  alt2"=""><code keyword"="">private</code> <code keyword"="">static</code> <code keyword"="">void</code> <code plain"="">shutdown() </code><code keyword"="">throws</code> <code plain"="">Exception {</code></div><div number2="" index1=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">Socket socket = </code><code keyword"="">new</code> <code plain"="">Socket(</code><code string"="">"localhost"</code><code plain"="">, shutdownPort);</code></div><div number3="" index2=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">OutputStream stream = socket.getOutputStream();</code></div><div number4="" index3=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword"="">for</code><code plain"="">(</code><code keyword"="">int</code> <code plain"="">i = </code><code value"="">0</code><code plain"="">;i &lt; shutdown.length();i++)</code></div><div number5="" index4=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">stream.write(shutdown.charAt(i));</code></div><div number6="" index5=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">stream.flush();</code></div><div number7="" index6=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">stream.close();</code></div><div number8="" index7=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">socket.close();</code></div><div number9="" index8=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">}</code></div></div></td></tr></tbody></table></div></div> <p> 	&nbsp;&nbsp;&nbsp;&nbsp;这样即可达到关闭tomcat的目的。</p> <p> 	 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实际上看整个项目代码，项目代码的运行，就是一个配置一个基础的server.xml（即tomcat目录下的 conf/server.xml)，先配置运行端口，关闭监听端口；然后配置运行的host以及添加一个上下文context，最后就开始运行并开始监 听。对照这个程序，再看一下server.xml中的配置信息，就很容易明白以上这段代码了。</p></div><img src ="http://www.blogjava.net/wangxinsh55/aggbug/431229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2016-07-18 14:42 <a href="http://www.blogjava.net/wangxinsh55/archive/2016/07/18/431229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat7升级至Tomcat8后兼容性问题修改</title><link>http://www.blogjava.net/wangxinsh55/archive/2015/04/09/424255.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Thu, 09 Apr 2015 09:35:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2015/04/09/424255.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/424255.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2015/04/09/424255.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/424255.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/424255.html</trackback:ping><description><![CDATA[Tomcat7默认的url串参数值是ios-8859-1编码；而Tomcat8默认的是UTF-8。<br />另外Tomcat8对写入cookie的字符串限制更严格，不允许使用/ 这样导致无法写Cookie的path路径。<br /><br />目前发现能解决的办法有两种<br />方案一、<br />server.xml文件Connector结点添加 URIEncoding="iso-8859-1" 属性<br /><br /><br />方案二、<br /><div>catalina.properties配置添加配置属性<br /><div>#设置为true则默认使用iso-8859-1编码，否则默认是UTF-8编码，参考Tomcat文档<br />#http://tomcat.apache.org/tomcat-8.0-doc/config/http.html<code>&nbsp; URIEncoding</code> 属性部分<br />#http://tomcat.apache.org/tomcat-8.0-doc/config/systemprops.html<code>&nbsp;&nbsp; org.apache.catalina. STRICT_SERVLET_COMPLIANCE</code> 属性部分<br />org.apache.catalina.STRICT_SERVLET_COMPLIANCE=true<br /><br />#Cookie的path限制修改，false允许使用/ 参考Tomcat文档<br />#http://tomcat.apache.org/tomcat-8.0-doc/config/systemprops.html<br /><div>org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR=false</div></div></div><img src ="http://www.blogjava.net/wangxinsh55/aggbug/424255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2015-04-09 17:35 <a href="http://www.blogjava.net/wangxinsh55/archive/2015/04/09/424255.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat的reloadable参数的意思</title><link>http://www.blogjava.net/wangxinsh55/archive/2011/05/31/351449.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Tue, 31 May 2011 08:55:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2011/05/31/351449.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/351449.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2011/05/31/351449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/351449.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/351449.html</trackback:ping><description><![CDATA[<div><div> 		<a id="viewpost1_TitleUrl" href="../../liyoubiggo/archive/2008/09/07/227583.html">tomcat的reloadable参数的意思</a> 	</div> 	<span style="word-spacing: 0px; font-family: verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: 22px; font-size-adjust: none; font-stretch: normal; text-transform: none; color: #000000; text-indent: 28px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;">开启了Tomcat的reloadable=true,那么每当相关文件改变时，Tomcat会停止web app并释放内存,然后重新加载web app.这实在是个浩大的工程。</span><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;另外网上有一篇文章是关于在Tomcat运行动态重载类，下面是该文章的内容<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="word-spacing: 0px; font-family: verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: 18px; font-size-adjust: none; font-stretch: normal; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; text-align: left; orphans: 2; widows: 2;"><span id="Post.ascx_ViewPost_PreviousAndNextEntriesUp"><a style="color: #000000; text-decoration: none;" href="http://blog.csdn.net/cm4ever/archive/2006/04/26/678539.aspx"><br /> </a></span> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">     <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">为什么写这篇文档？</p>     </li></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">使 用过hibernate, spring或其他大型组件，写过50个类以上的网络应用程序(web  application)的开发者应该知道，当系统中有很多类时，如果开启了Tomcat的reloadable=true,那么每当相关文件改变 时，Tomcat会停止web app并释放内存,然后重新加载web app.这实在是个浩大的工程。<br /> </p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">所以我总是在想如果能有只重载某几个类的功能，将极大的满足我这个即时调试狂。</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">去年我在论坛上发帖，才发现已经有一些应用服务器具有了这个功能，比如WebLogic, WebSphere,&nbsp;等等。好像还有一个很酷的名字，叫开发模式。看来我还是孤陋寡闻了点。</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">当然很多人都是在Tomcat上开发，包括我。我很喜欢它的轻小，那些大内存和高CPU消耗的应用服务器不愧为硬件杀手，没理由不改进Tomcat :)。</p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;" start="2"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">     <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">最终实现功能</p>     </li></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">我没有时间去研究Tomcat的文件监听机制，也没时间去把他写成&#8221;开发模式&#8221;这么完整的功能，我最终实现的是，实现重载功能的测试jsp－－很抱歉我还是没办法写得更完整。当然，你可以在这个基础上进行改进。</p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;" start="3"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">     <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">阅读须知</p>     </li></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">阅读本文，你应该具备以下知识</p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">jvm&nbsp;规范有关类加载器的章节</p>         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left"><a style="color: #336699; text-decoration: none;" href="http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html">http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html</a></p>         </li><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">Tomcat&nbsp;类加载机制</p>         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left"><a style="color: #336699; text-decoration: none;" href="http://www.huihoo.org/apache/tomcat/">http://www.huihoo.org/apache/tomcat/</a></p>         </li><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">java&nbsp;反射机制</p>         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left"><a style="color: #336699; text-decoration: none;" href="http://java.sun.com/docs/books/tutorial/reflect/">http://java.sun.com/docs/books/tutorial/reflect/</a></p>         </li><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">ant</p>         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left"><a style="color: #336699; text-decoration: none;" href="http://ant.apache.org/">http://ant.apache.org/</a></p>         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">(好象该网址被不定时封锁，有时能上，有时不能)</p>         </li></ol></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">最好在你的电脑上安装ant,因为Tomcat源码包使用ant从互联网获得依赖包。不过我也是修改了一个错误才使它完全编译通过。</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">当然，你也可以用其他IDE工具检查并添加依赖包，在IDE中，其实你只需要添加jar直到使org.apache.catalina.loader.WebappClassLoader无错即可。</p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;" start="4"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">     <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">修改过程</p>     <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">说明</p>         </li></ol>     </li></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left"><strong>新添加的代码请添加到java文件的末尾，因为我在说明行数的时候，尽量符合原始行数</strong></p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;" start="2"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">web app类加载器</p>         </li></ol></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">在Tomcat中，org.apache.catalina.loader.WebappClassLoader是web app的类加载器，所以需要修改它实现重载功能。</p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;" start="3"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">资源列表</p>         </li></ol></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">在WebappClassLoader中，有一个Map类型属性resourceEntries，它记载了web app中WEB-INF/classes目录下所加载的类，因此当我们需要重载一个类时，我们需要先将它在resourceEntries里删除，我编写了一个方法方便调用：</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left"><strong>public</strong>&nbsp;<strong>boolean</strong>&nbsp;removeResourceEntry(String name) {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp; <strong>if</strong>&nbsp;(resourceEntries.containsKey(name)) {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resourceEntries.remove(name);</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>return</strong>&nbsp;<strong>true</strong>;</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp; }</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp; <strong>return</strong>&nbsp;<strong>false</strong>;</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">}</p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;" start="4"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">是否重载标志</p>         </li></ol></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">让WebappClassLoader需要知道加载一个类是否使用重载的方式。所以我建立一个boolean&nbsp;类型的属性和实现它的getter/setter方法：</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left"><strong>private</strong>&nbsp;<strong>boolean</strong>&nbsp;isReload =&nbsp;<strong>false</strong>;</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;"><br /> </p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>public</strong>&nbsp;<strong>boolean</strong>&nbsp;isReload() {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>return</strong>&nbsp;isReload;</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;"><br /> </p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>public</strong>&nbsp;<strong>void</strong>&nbsp;setReload(<strong>boolean</strong>&nbsp;isReload) {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>this</strong>.isReload = isReload;</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;" start="5"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">动态类加载器</p>         </li></ol></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">根据jvm类加载器规范，一个类加载器对象只能加载一个类1次，所以重载实际上是创建出另一个类加载器对象来加载同一个类。当然，我们不需要再创建一个WebappClassLoader，他太大而且加载规则很复杂，不是我们想要的，所以我们创建一个简单的类加载器类org.apache.catalina.loader.DynamicClassLoader：</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left"><strong>package</strong>&nbsp;org.apache.catalina.loader;</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;"><br /> </p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;"><strong>import</strong>&nbsp;java.net.URL;</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;"><strong>import</strong>&nbsp;java.net.URLClassLoader;</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;"><strong>import</strong>&nbsp;java.security.CodeSource;</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;"><strong>import</strong>&nbsp;java.util.*;</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;"><br /> </p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">/**</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">*&nbsp;动态类加载器</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">*</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">*&nbsp;<strong>@author&nbsp;</strong>peter</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">*</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">*/</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;"><strong>public</strong>&nbsp;<strong>class</strong>&nbsp;DynamicClassLoader&nbsp;<strong>extends</strong>&nbsp;URLClassLoader {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;父类加载器&nbsp;*/</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;<strong>private</strong>&nbsp;ClassLoader parent =&nbsp;<strong>null</strong>;</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;"><br /> </p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;已加载类名列表&nbsp;*/</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;<strong>private</strong>&nbsp;List classNames =&nbsp;<strong>null</strong>;</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;"><br /> </p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;/**</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;构造器</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<strong>@param&nbsp;</strong>parent</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;父类加载器，这里传入的是WebappClassLoader</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*/</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong>&nbsp;DynamicClassLoader(ClassLoader parent) {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>super</strong>(<strong>new</strong>&nbsp;URL[0]);</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classNames =&nbsp;<strong>new</strong>&nbsp;ArrayList();</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>this</strong>.parent = parent;</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;}</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;"><br /> </p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;/**</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;从类的二进制数据中加载类.</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<strong>@param&nbsp;</strong>name</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;类名</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<strong>@param&nbsp;</strong>classData</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;类的二进制数据</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<strong>@param&nbsp;</strong>codeSource</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;数据来源</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<strong>@return&nbsp;</strong>成功加载的类</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<strong>@throws&nbsp;</strong>ClassNotFoundException</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;加载失败抛出未找到此类异常</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*/</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong>&nbsp;Class loadClass(String name,&nbsp;<strong>byte</strong>[] classData,&nbsp;CodeSource codeSource)<strong>&nbsp;throws</strong>&nbsp;ClassNotFoundException {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>if</strong>&nbsp;(classNames.contains(name)) {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// System.out.println("此类已存在，调用&nbsp;loadClass&nbsp;方法加载.");</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>return</strong>&nbsp;loadClass(name);</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<strong>else</strong>&nbsp;{</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// System.out.println("新类,&nbsp;记录到类名列表，并用类定义方法加载类");</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classNames.add(name);</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>return</strong>&nbsp;defineClass(name, classData, 0, classData.length, codeSource);</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;}</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;"><br /> </p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;/* *</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;重载此方法，当要加载的类不在类名列表中时，调用父类加载器方法加载.</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;* @see java.lang.ClassLoader#loadClass(java.lang.String)</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;*/</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong>&nbsp;Class loadClass(String name)&nbsp;<strong>throws</strong>&nbsp;ClassNotFoundException {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>if</strong>&nbsp;(!classNames.contains(name)) {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//System.out.println("不在类名列表中，调用父类加载器方法加载");</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>return</strong>&nbsp;parent.loadClass(name);</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>return</strong>&nbsp;<strong>super</strong>.loadClass(name);</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;}</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">}</p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;" start="6"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">在webappClassLoader中添加DynamicClassLoader</p>         <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">             <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">添加属性</p>             </li></ol>         </li></ol></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left"><strong>private</strong>&nbsp;DynamicClassLoader dynamicClassLoader =&nbsp;<strong>new</strong>&nbsp;DynamicClassLoader(<strong>this</strong>);</p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;" start="2"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">             <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">添加重建方法，以便需要再次重载时替换掉上次的类加载器对象</p>             </li></ol></ol></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left"><strong>public</strong>&nbsp;<strong>void</strong>&nbsp;reCreateDynamicClassLoader() {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dynamicClassLoader =&nbsp;<strong>new</strong>&nbsp;DynamicClassLoader(<strong>this</strong>);</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;" start="7"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">修改调用点</p>         <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">             <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">第832行，公开findClass方法</p>             </li></ol>         </li></ol></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left"><strong>public</strong>&nbsp;Class findClass(String name)&nbsp;<strong>throws</strong>&nbsp;ClassNotFoundException {</p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;" start="2"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">             <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">第1569行，添加如下一行代码。</p>             </li></ol></ol></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left"><strong>if</strong>&nbsp;(isReload) removeResourceEntry(name);</p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;" start="3"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">             <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">第1577行，这里好像是一个bug，具体原因我忘了-_-||</p>             </li></ol></ol></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left"><strong>if</strong>&nbsp;((entry ==&nbsp;<strong>null</strong>) || (entry.binaryContent ==&nbsp;<strong>null</strong>))</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">改为</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left"><strong>if</strong>&nbsp;((entry ==&nbsp;<strong>null</strong>) || (entry.loadedClass ==&nbsp;<strong>null</strong>&nbsp;&amp;&amp; entry.binaryContent ==&nbsp;<strong>null</strong>))</p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;" start="4"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">             <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">第1633~1636行</p>             </li></ol></ol></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left"><strong>if</strong>&nbsp;(entry.loadedClass ==&nbsp;<strong>null</strong>) {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clazz = defineClass(name, entry.binaryContent, 0, entry.binaryContent.length,</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;codeSource);</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;改为</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>byte</strong>[] classData =&nbsp;<strong>new</strong>&nbsp;<strong>byte</strong>[entry.binaryContent.length];</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.arraycopy(entry.binaryContent, 0, classData, 0,</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classData.length);</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>if</strong>&nbsp;(entry.loadedClass ==&nbsp;<strong>null</strong>) {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clazz = isReload ?</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dynamicClassLoader.loadClass(name,</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classData, codeSource) :</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defineClass(name,</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classData, 0, classData.length, codeSource);</p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;" start="8"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">测试代码</p>         <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">             <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">test.jsp</p>             </li></ol>         </li></ol></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">我测试用的jsp为$CATALINA_HOME/webapps/ROOT/test.jsp，由于webapp里面并不会显式加载tomcat的核心类，所以我们需要用反射代码调用WebappClassLoader的方法。代码如下：</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">&lt;%</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">ClassLoader loader = (Thread.currentThread().getContextClassLoader());</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">Class clazz = loader.getClass();</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">java.lang.reflect.Method setReload = clazz.getMethod("setReload",&nbsp;<strong>new</strong>&nbsp;Class[]{<strong>boolean</strong>.<strong>class</strong>});</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">java.lang.reflect.Method reCreate = clazz.getMethod("reCreateDynamicClassLoader",&nbsp;<strong>null</strong>);</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">java.lang.reflect.Method findClass = clazz.getMethod("findClass",&nbsp;<strong>new</strong>&nbsp;Class[]{String.<strong>class</strong>});</p>  <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">reCreate.invoke(loader,&nbsp;<strong>null</strong>);</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">setReload.invoke(loader,&nbsp;<strong>new</strong>&nbsp;Object[]{<strong>true</strong>});</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">Class A = (Class)findClass.invoke(loader,&nbsp;<strong>new</strong>&nbsp;Object[]{"org.AClass"});</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">setReload.invoke(loader,&nbsp;<strong>new</strong>&nbsp;Object[]{<strong>false</strong>});</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">A.newInstance();</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">//&nbsp;如果你使用下面这行代码，当重编译类时，请稍微修改一下调用它的jsp，让jsp也重新编译</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">//org.AClass a = (org.AClass)A.newInstance();</p>  <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">//&nbsp;下面这些代码是测试当一个类不在DynamicClassLoader类名列表时的反应</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">//a.test();</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">//java.lang.reflect.Method test = a.getClass().getMethod("test", null);</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">//test.invoke(a, null);</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">%&gt;</p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;" start="2"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">             <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">org.AClass</p>             </li></ol></ol></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left"><strong>package</strong>&nbsp;org;</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;"><br /> </p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong>&nbsp;<strong>class</strong>&nbsp;AClass {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong>&nbsp;AClass() {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;修改输出内容确认Tomcat重新加载了类</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("AClass v3");</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;"><br /> </p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong>&nbsp;<strong>void</strong>&nbsp;createBClass() {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>new</strong>&nbsp;BClass();</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;" start="3"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">             <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">org.BClass</p>             </li></ol></ol></ol> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left"><strong>package</strong>&nbsp;org;</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;"><br /> </p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong>&nbsp;<strong>class</strong>&nbsp;BClass {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong>&nbsp;BClass() {</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//修改输出内容确认Tomcat重新加载了类</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("BClass v1");</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p> <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p> <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;" start="9"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">         <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">测试步骤</p>         <ol style="margin: 5px 0px 5px 35px; padding: 0px; list-style-type: none;"><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">             <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">按照上述步骤修改Tomcat源码并编译。</p>             </li><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">             <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">用winzip/winrar/file-roller打开$CATALINA_HOME/server/lib/catalina.jar。把前面编译完成后的org.apache.catalina.loader目录下的class文件覆盖jar中同名文件。</p>             </li><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">             <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">编译org.AClass和org.BClass</p>             </li><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">             <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">启动Tomcat并在浏览器中打开测试页http://localhost:8080/test.jsp</p>             </li><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">             <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">修改org.AClass中的System.out.println();语句并重编译类。</p>             </li><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">             <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">按下F5按键刷新浏览器。</p>             </li><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">             <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">查看Tomcat控制台是否输出了不同的语句？</p>             </li><li style="margin: 0px; padding: 2px 0px; list-style-type: decimal;">             <p style="margin: 1em 0px 0.5em; padding: 0px; font-size: 14px; text-indent: 2em; line-height: 22px;" align="left">Good Luck! :)))</p>             </li></ol>         </li></ol></ol> </span>  	</div><img src ="http://www.blogjava.net/wangxinsh55/aggbug/351449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2011-05-31 16:55 <a href="http://www.blogjava.net/wangxinsh55/archive/2011/05/31/351449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> tomcat定时重启与服务注册方法 </title><link>http://www.blogjava.net/wangxinsh55/archive/2010/01/27/310929.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Wed, 27 Jan 2010 05:15:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2010/01/27/310929.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/310929.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2010/01/27/310929.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/310929.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/310929.html</trackback:ping><description><![CDATA[<p>保存以下脚本成tomcat.bat，计划任务指定每天4点执行该脚本<br />
@echo off<br />
net stop tomcat5<br />
rem ping 20个包，实现延时功能<br />
ping 127.0.0.1 -n 20<br />
net start tomcat5<br />
&nbsp;<br />
&nbsp;<br />
注意这里的tomcat5是tomcat在windows的服务名，注册服务的方法如下：<br />
找到tomcat安装目录bin子目录下的service.bat<br />
在命令行里执行：<br />
service.bat install<br />
则自动安装服务。<br />
定时重启SQL Server<br />
net stop mssqlserver<br />
net start mssqlserver<br />
tomcat产生垃圾缓存文件的处理与tomcat的定时重启</p>
<p>由于程序中使用了jtds驱动来连接数据库。<br />
一段时间后，我发现tomcat的temp文件夹内jtds*.tmp文件(形如jtds424647.tmp)越来越多，容量也越来越大。有一次清理时，据然有几个G多，严重的影响了系统的运行速度。</p>
<p>解决措施:</p>
<p>如果是linux系统<br />
可以指定启动时-Djava.io.tmpdir=/tmp<br />
这个目录系统会用cron脚本自动清理文件</p>
<p>如果是windows，需要定期清理tomcat的tmp文件</p>
<p>可以用windows自带的定时任务器建立如下delTmp.bat的文件</p>
<p>@echo off</p>
<p>&nbsp;</p>
<p>:start</p>
<p>::启动过程，切换目录</p>
<p>set pwd=%cd%</p>
<p>cd %1</p>
<p>echo 工作目录是：&amp; chdir</p>
<p>&nbsp;</p>
<p>:clean</p>
<p>::主处理过程，执行清理工作</p>
<p>@echo on</p>
<p>rem @for&nbsp; /r %%c in (.log) do @if exist %%c ( rd /s /q %%c &amp; echo&nbsp;&nbsp;&nbsp;&nbsp; 删除目录%%c)</p>
<p>@echo off</p>
<p>@del logs\*.log</p>
<p>@del temp\*.tmp</p>
<p>del /f /s /q E:\osaplatform\WEB-INF\logs\*.log.*-*</p>
<p>echo "当前目录下的log信息已清除"</p>
<p>goto end</p>
<p>&nbsp;</p>
<p>:noclean</p>
<p>::分支过程，取消清理工作</p>
<p>echo "log信息清楚操作已取消"</p>
<p>goto end</p>
<p>&nbsp;</p>
<p>:end</p>
<p>::退出程序</p>
<p>cd "%pwd%"</p>
<p>REM pause</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Tomcat由于运行的时间过长造成内存不宜释放，导致运行性能的降低，定时重启tomcat有利于提升系统的性能，</p>
<p>首先建立如下的bat文件</p>
<p>set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_06</p>
<p>E:\tomcat6_hb\bin\service.bat install Tomcat604</p>
<p>注册为windows服务</p>
<p>然后在建立tomcat.bat，并将此文件放到windows定期任务中</p>
<p>@echo off</p>
<p>net stop tomcat5</p>
<p>rem ping 20个包，实现延时功能</p>
<p>ping 127.0.0.1 -n 20</p>
<p>net start tomcat5</p>
<p>如果需要解除服务，则建立如下文件，直接执行即可</p>
<p>set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_06</p>
<p>E:\tomcat6_hb\bin\service.bat remove Tomcat604<br />
</p>
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/310929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2010-01-27 13:15 <a href="http://www.blogjava.net/wangxinsh55/archive/2010/01/27/310929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决Tomcat下Context重复启动(转)</title><link>http://www.blogjava.net/wangxinsh55/archive/2009/03/11/259229.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Wed, 11 Mar 2009 14:09:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2009/03/11/259229.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/259229.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2009/03/11/259229.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/259229.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/259229.html</trackback:ping><description><![CDATA[<p>配置了个定时抓取任务，结果总是抓取三次<br />
从Tomcat的log上看到该任务所在的Context有三次启动的过程，计划任务也被创建了三次</p>
<p>问题原来出在Host的appBase设置上，原来的设置是这样的</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: olive;">&lt;</span><span style="color: green;">Host</span><span style="color: gray;"> </span><span style="color: #00008b;">name</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">www.xxx.com</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">appBase</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">/usr/local/projects/xxx/</span><span style="color: #8b0000;">"</span><span style="color: gray;"><br />
&nbsp;&nbsp;   </span><span style="color: #00008b;">unpackWARs</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">false</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">autoDeploy</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">true</span><span style="color: #8b0000;">"</span><span style="color: gray;"><br />
&nbsp;&nbsp;   </span><span style="color: #00008b;">xmlValidation</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">false</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">xmlNamespaceAware</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">false</span><span style="color: #8b0000;">"</span><span style="color: olive;">&gt;</span><span style="color: gray;"><br />
&nbsp;&nbsp;   </span><span style="color: olive;">&lt;</span><span style="color: green;">Context</span><span style="color: gray;"> </span><span style="color: #00008b;">docBase</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">web</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">path</span><span style="color: gray;">=</span><span style="color: #8b0000;">""</span><span style="color: gray;"> </span><span style="color: #00008b;">reloadable</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">true</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">workDir</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">work</span><span style="color: #8b0000;">"</span><span style="color: olive;">&gt;</span><span style="color: gray;"><br />
&nbsp;&nbsp;       </span><span style="color: #ffa500;">&lt;!-- Others --&gt;</span><span style="color: gray;"><br />
&nbsp;&nbsp;   </span><span style="color: olive;">&lt;/</span><span style="color: green;">Context</span><span style="color: olive;">&gt;</span><span style="color: gray;"><br />
</span><span style="color: olive;">&lt;/</span><span style="color: green;">Host</span><span style="color: olive;">&gt;</span><span style="color: gray;"><br />
<br />
</span><span style="color: olive;">&lt;</span><span style="color: green;">Host</span><span style="color: gray;"> </span><span style="color: #00008b;">name</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">admin.xxx.com</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">appBase</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">/usr/local/projects/xxx/</span><span style="color: #8b0000;">"</span><span style="color: gray;"><br />
&nbsp;&nbsp;   </span><span style="color: #00008b;">unpackWARs</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">false</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">autoDeploy</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">true</span><span style="color: #8b0000;">"</span><span style="color: gray;"><br />
&nbsp;&nbsp;   </span><span style="color: #00008b;">xmlValidation</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">false</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">xmlNamespaceAware</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">false</span><span style="color: #8b0000;">"</span><span style="color: olive;">&gt;</span><span style="color: gray;"><br />
&nbsp;&nbsp;   </span><span style="color: olive;">&lt;</span><span style="color: green;">Context</span><span style="color: gray;"> </span><span style="color: #00008b;">docBase</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">admin</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">path</span><span style="color: gray;">=</span><span style="color: #8b0000;">""</span><span style="color: gray;"> </span><span style="color: #00008b;">reloadable</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">true</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">workDir</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">work</span><span style="color: #8b0000;">"</span><span style="color: olive;">&gt;</span><span style="color: gray;"><br />
&nbsp;&nbsp;       </span><span style="color: #ffa500;">&lt;!-- Others --&gt;</span><span style="color: gray;"><br />
&nbsp;&nbsp;   </span><span style="color: olive;">&lt;/</span><span style="color: green;">Context</span><span style="color: olive;">&gt;</span><span style="color: gray;"><br />
</span><span style="color: olive;">&lt;/</span><span style="color: green;">Host</span><span style="color: olive;">&gt;</span></div>
</div>
<p>改成不设置appBase，只对指定的Context设置docBase就ok了</p>
<p><span style="color: olive;">&lt;</span><span style="color: green;">Host</span><span style="color: gray;"> </span><span style="color: #00008b;">name</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">www.xxx.com</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">appBase</span><span style="color: gray;">=</span><span style="color: #8b0000;">""</span><span style="color: gray;"><br />
&nbsp;&nbsp;   </span><span style="color: #00008b;">unpackWARs</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">false</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">autoDeploy</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">true</span><span style="color: #8b0000;">"</span><span style="color: gray;"><br />
&nbsp;&nbsp;   </span><span style="color: #00008b;">xmlValidation</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">false</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">xmlNamespaceAware</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">false</span><span style="color: #8b0000;">"</span><span style="color: olive;">&gt;</span><span style="color: gray;"><br />
&nbsp;&nbsp;   </span><span style="color: olive;">&lt;</span><span style="color: green;">Context</span><span style="color: gray;"> </span><span style="color: #00008b;">docBase</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">/usr/local/projects/xxx/web</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">path</span><span style="color: gray;">=</span><span style="color: #8b0000;">""</span><span style="color: gray;"> </span><span style="color: #00008b;">reloadable</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">true</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">workDir</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">work</span><span style="color: #8b0000;">"</span><span style="color: olive;">&gt;</span><span style="color: gray;"><br />
&nbsp;&nbsp;       </span><span style="color: #ffa500;">&lt;!-- Others --&gt;</span><span style="color: gray;"><br />
&nbsp;&nbsp;   </span><span style="color: olive;">&lt;/</span><span style="color: green;">Context</span><span style="color: olive;">&gt;</span><span style="color: gray;"><br />
</span><span style="color: olive;">&lt;/</span><span style="color: green;">Host</span><span style="color: olive;">&gt;</span><span style="color: gray;"><br />
<br />
</span><span style="color: olive;">&lt;</span><span style="color: green;">Host</span><span style="color: gray;"> </span><span style="color: #00008b;">name</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">admin.xxx.com</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">appBase</span><span style="color: gray;">=</span><span style="color: #8b0000;">""</span><span style="color: gray;"><br />
&nbsp;&nbsp;   </span><span style="color: #00008b;">unpackWARs</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">false</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">autoDeploy</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">true</span><span style="color: #8b0000;">"</span><span style="color: gray;"><br />
&nbsp;&nbsp;   </span><span style="color: #00008b;">xmlValidation</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">false</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">xmlNamespaceAware</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">false</span><span style="color: #8b0000;">"</span><span style="color: olive;">&gt;</span><span style="color: gray;"><br />
&nbsp;&nbsp;   </span><span style="color: olive;">&lt;</span><span style="color: green;">Context</span><span style="color: gray;"> </span><span style="color: #00008b;">docBase</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">/usr/local/projects/xxx/admin</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">path</span><span style="color: gray;">=</span><span style="color: #8b0000;">""</span><span style="color: gray;"> </span><span style="color: #00008b;">reloadable</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">true</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">workDir</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">work</span><span style="color: #8b0000;">"</span><span style="color: olive;">&gt;</span><span style="color: gray;"><br />
&nbsp;&nbsp;       </span><span style="color: #ffa500;">&lt;!-- Others --&gt;</span><span style="color: gray;"><br />
&nbsp;&nbsp;   </span><span style="color: olive;">&lt;/</span><span style="color: green;">Context</span><span style="color: olive;">&gt;</span></p>
<p> </p>
<span style="color: gray;">
<p>为什么不设置appBase就OK来呢？</p>
<div class="thdrpy">因为设置了appBase就会自动去加载底下所有的项目</div>
</span>
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/259229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2009-03-11 22:09 <a href="http://www.blogjava.net/wangxinsh55/archive/2009/03/11/259229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat下 共享session (摘自网上，没有具体验证，如果哪位验证了，请告知一下谢谢)</title><link>http://www.blogjava.net/wangxinsh55/archive/2009/03/06/258199.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 06 Mar 2009 06:23:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2009/03/06/258199.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/258199.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2009/03/06/258199.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/258199.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/258199.html</trackback:ping><description><![CDATA[如何在一个tomcat下的几个web应用之间共享session<br />
<p>我们采取的是集中管理的办法。主要技术：</p>
<p>1.设置Context 的crossContext="true"，使得各个web应用的servletcontext是可以互访的</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Host name="localhost" appBase="webapps"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unpackWARs="true" autoDeploy="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlValidation="false" xmlNamespaceAware="false"&gt;<br />
&lt;Context path="/SessionManager" reloadable="true" crossContext="true"&gt;&lt;/Context&gt; <br />
&lt;Context path="/SessionManagerTest1" reloadable="true" crossContext="true"&gt;&lt;/Context&gt;<br />
&lt;Context path="/SessionManagerTest2" reloadable="true" crossContext="true"&gt;&lt;/Context&gt;</p>
<p>2.主动设置cookies，设置jsessionid为被共享的session的id，统一利用requestsessionid在指定的一个
servletcontext里的一个map查找对于的session，需要存取attribute都对取得的session操作</p>
<p>3.用监听器监听属性的失效</p>
<p><br />
</p>
<p><br />
</p>
<h1>Tomcat集群之Session复制配置 分享 </h1>
因为最近的项目要用到多web服务器实现访问负载和集群，负载调度使用的是LVS，而非apache的负载调度，因为在高访问量和大并发量的时候LVS的
性能比APACHE好。然后在web服务器上是使用tomcat5.5.25做应用服务器，对于tomcat的集群有两种方式，这个主要是针对
session而言的。一种就是sticky模式，即黏性会话模式；另外一种就是session复制模式了。所谓sticky模式就是说同一个用户的访问
请求都被派送到同一个tomcat实例上，这样我们就无须在多台服务器之间实现session共享了，这是其好处，不好的地方就是不能实现
failureover了，一但用户访问的机器挂掉，那么其session就会丢失。而session复制模式就可以很好的解决failureover的
问题，即使某一台web服务器挂掉了，用户的请求还会被负载到其他的web服务器上，而且session也被复制了，这样对用户而言就像是在同一台机器上
操作一样，不好的地方就是session复制需要系统资源和网络的开销，尤其是当web服务器多的时候或session里存储的数据量大的时候，这点将会
比较的明显（不过自己还没有做这方面的测试）。 <br />
<br />
针对这两种方式的弊端和好处，我们可以采用将两种方式结合的方式来达到更好的效果，那
就是sticky+session复制模式了。用户的请求按照
sticky方式被分发到同一个web服务器上，同时tomcat在后台做异步复制（非同步）session到其他web服务器，这样我们使用
sticky的简便性，同时又有了一定的容错能力。 <br />
<br />
下面我就将自己的tomcat集群配置经验跟大家分享一下，呵呵。现在想来，其实tomcat的集群配置真的是非常简单，几乎不需要改什么东西了。我今天就在windows上用一台机器来跑两个tomcat实例，下面是一些基础条件： <br />
1.两个tomcat的目录分别为：d:\apache-tomcat-5.5.25-node1和d:\apache-tomcat-5.5.25-node2 <br />
2.在每个tomcat目录下的conf\Catalina\localhost目录下建立一个ROOT.xml文件，其内容为： <br />
1 &lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />
2 &lt;Context docBase="D:/mywebapps/test1" <br />
3 privileged="true" antiResourceLocking="false" antiJARLocking="false" distributable="true"&gt; <br />
4 &lt;/Context&gt; <br />
<br />
3.修改apache-tomcat-5.5.25-node1的connector端口为8091，修改apache-tomcat-5.5.25-node2的connector的端口为8092，这样是为了避免在同一机器上同时启动时造成访问端口冲突； <br />
4.修改apache-tomcat-5.5.25-node2的Server端口为8006，与apache-tomcat-5.5.25-node1的Server端口8005不一样，也是避免两个tomcat实例启动时造成程序端口的冲突问题； <br />
5.修改apache-tomcat-5.5.25-node2的AJP/1.3的端口为8019或其他非8009（默认）的端口，也是为了避免与apache-tomcat-5.5.25-node1的AJP/1.3端口冲突； <br />
<br />
这
样，我们就可以保证每一个tomcat单独启动时都可以提供D:/mywebapps/test1的web服务，注意是单个启动哦，然后分别启动
apache-tomcat-5.5.25-node1和apache-tomcat-5.5.25-node2后，输入如下地址分别进行访问你的web
应用： <br />
apache-tomcat-5.5.25-node1的访问地址：http://localhost:8091/你的页面地址 <br />
apache-tomcat-5.5.25-node2的访问地址：http://localhost:8092/你的页面地址 <br />
如果你的tomcat没能成功的提供服务，那么你就需要查看一下是否tomcat部署成功了。注意这里的D:/mywebapps/test1就是你的web应用的物理路径了，可以随意修改。下面就开始对server.xml文件的配置了。 <br />
<br />
找到apache-tomcat-5.5.25-node1目录下的server.xml文件，打开并找到配置Engine的位置，我们在最后加入 jvmRoute="node1"，表示这个tomcat的实例名称为node1。修改前后的对比如下： <br />
<br />
修改前： <br />
&lt;Engine name="Catalina" defaultHost="localhost"&gt; <br />
修改后： <br />
&lt;Engine name="Catalina" defaultHost="localhost" jvmRoute="node1"&gt; <br />
<br />
然
后找到Cluster标签，并取消它的注释即可，无须做任何修改。同样，我们修改apache-tomcat-5.5.25-node2下的
server.xml文件，修改jvmRoute="node2"，然后也是注释掉Cluster标签，注意，然后还要修改Cluster标签下的
Receiver标签的tcpListenPort端口号，我们改为4002（默认的是4001），这个是为了避免两个tomcat实例同时启动时造成冲
突。 <br />
<br />
通过上面的配置后，我们两个tomcat已经配置完毕，并且可以完成集群任务了。注意启动的时候不能直接双击其bing目录下的
startup.bat文件，我们还需要为每一个tomcat设置环境变量，分别在apache-tomcat-5.5.25-node1和
apache-tomcat- 5.5.25-node2的根目录下编写一个bat文件，内容如下： <br />
<br />
apache-tomcat-5.5.25-node1目录下的startup_node1.bat内容： <br />
set CATALINA_HOME=d:\apache-tomcat-5.5.25-node1 <br />
bin/startup.bat <br />
<br />
apache-tomcat-5.5.25-node2目录下的startup_node2.bat内容： <br />
set CATALINA_HOME=d:\apache-tomcat-5.5.25-node2 <br />
bin/startup.bat <br />
<br />
然后分别运行这两批处理文件即可正常启动tomcat了。我们先启动node1，双击startup_node1.bat启动node1。我们可以在窗口的最上面看到如下的输出信息： <br />
2008-1-4 19:12:24 org.apache.catalina.cluster.tcp.SimpleTcpCluster start <br />
信息: Cluster is about to start <br />
2008-1-4 19:12:25 org.apache.catalina.cluster.tcp.ReplicationTransmitter start <br />
信息: Start ClusterSender at cluster Catalina:type=Cluster,host=localhost with n <br />
ame Catalina:type=ClusterSender,host=localhost <br />
2008-1-4 19:12:25 org.apache.catalina.cluster.mcast.McastServiceImpl setupSocket <br />
<br />
信息: Setting cluster mcast soTimeout to 500 <br />
2008-1-4 19:12:25 org.apache.catalina.cluster.mcast.McastService start <br />
信息: Sleeping for 2000 milliseconds to establish cluster membership <br />
2008-1-4 19:12:27 org.apache.catalina.cluster.mcast.McastService registerMBean <br />
信息: membership mbean registered (Catalina:type=ClusterMembership,host=localhos <br />
t) <br />
2008-1-4 19:12:27 org.apache.catalina.cluster.deploy.FarmWarDeployer start <br />
信息: Cluster FarmWarDeployer started. <br />
2008-1-4 19:12:29 org.apache.catalina.cluster.session.DeltaManager start <br />
信息: Starting clustering manager...: <br />
2008-1-4 19:12:29 org.apache.catalina.cluster.session.DeltaManager start <br />
信息: Register manager to cluster element Host with name localhost <br />
2008-1-4 19:12:29 org.apache.catalina.cluster.session.DeltaManager start <br />
信息: Starting clustering manager at <br />
2008-1-4 19:12:29 org.apache.catalina.cluster.session.DeltaManager getAllCluster <br />
Sessions <br />
信息: Manager []: skipping state transfer. No members active in cluster group. <br />
<br />
这表明我们的tomcat集群已经正常启动了。然后我们再运行apache-tomcat-5.5.25-node2目录下的startup_node2.bat以启动node2。然后我们可以可以在窗口的最上方看到如下的信息输出： <br />
2008-1-4 19:16:32 org.apache.catalina.cluster.tcp.SimpleTcpCluster start <br />
信息: Cluster is about to start <br />
2008-1-4 19:16:32 org.apache.catalina.cluster.tcp.ReplicationTransmitter start <br />
信息: Start ClusterSender at cluster Catalina:type=Cluster,host=localhost with n <br />
ame Catalina:type=ClusterSender,host=localhost <br />
2008-1-4 19:16:32 org.apache.catalina.cluster.mcast.McastServiceImpl setupSocket <br />
<br />
信息: Setting cluster mcast soTimeout to 500 <br />
2008-1-4 19:16:32 org.apache.catalina.cluster.mcast.McastService start <br />
信息: Sleeping for 2000 milliseconds to establish cluster membership <br />
2008-1-4 19:16:32 org.apache.catalina.cluster.tcp.SimpleTcpCluster memberAdded <br />
信息: Replication member added:org.apache.catalina.cluster.mcast.McastMember[tcp <br />
://192.168.1.227:4001,catalina,192.168.1.227,4001, alive=245203] <br />
2008-1-4 19:16:34 org.apache.catalina.cluster.mcast.McastService registerMBean <br />
信息: membership mbean registered (Catalina:type=ClusterMembership,host=localhos <br />
t) <br />
2008-1-4 19:16:34 org.apache.catalina.cluster.deploy.FarmWarDeployer start <br />
信息: Cluster FarmWarDeployer started. <br />
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager start <br />
信息: Starting clustering manager...: <br />
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager start <br />
信息: Register manager to cluster element Host with name localhost <br />
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager start <br />
信息: Starting clustering manager at <br />
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager getAllCluster <br />
Sessions <br />
警告: Manager [], requesting session state from org.apache.catalina.cluster.mcas <br />
t.McastMember[tcp://192.168.1.227:4001,catalina,192.168.1.227,4001, alive=248203 <br />
]. This operation will timeout if no session state has been received within 60 s <br />
econds. <br />
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager waitForSendAl <br />
lSessions <br />
<br />
请注意node2窗口输出的不同颜色部分，这个已经表示node2节点和node2节点联系上了。我们再回过来看node1窗口的输出信息，发现多出了如下的信息： <br />
2008-1-4 19:16:34 org.apache.catalina.cluster.tcp.SimpleTcpCluster memberAdded <br />
信息: Replication member added:org.apache.catalina.cluster.mcast.McastMember[tcp <br />
://192.168.1.227:4002,catalina,192.168.1.227,4002, alive=0] <br />
这
表明node1也已经侦听到了node2，两个tomcat服务器已经建立了联系。然后我们访问node1的一个地址A，假设这个地址A往
session里设置一个属性，然后我们再在同一窗口中访问node2的一个地址B，假设B是从session里读取这个属性，我们会发现B地址确实得到
了这个刚刚我们在node1上设置进去的值。这里要特别注意的是，我们两个地址的分别访问必须是在同一个窗口中，因为我们没有做前端的web负载，所以使
用不同的窗口进行访问会出现不同的session(因为端口号不一样,也就导致访问地址不一样了)，这样就导致无法查看的问题。<br />
<br />
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/258199.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2009-03-06 14:23 <a href="http://www.blogjava.net/wangxinsh55/archive/2009/03/06/258199.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat 配置集锦</title><link>http://www.blogjava.net/wangxinsh55/archive/2008/03/12/185627.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Wed, 12 Mar 2008 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2008/03/12/185627.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/185627.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2008/03/12/185627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/185627.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/185627.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Tomcat 配置集锦引用通告地址: http://www.renzhiyuan.com/trackback.asp?tbID=79 Tomcat 服务器server.xml的关键参数配置 说明：以下文字均以tomcat5.0.30为例进行。 1，配置tomcat服务器访问端口，只需配置Connector的port端口即可。Tomcat默认为8080，现修改port参数值为80。 2，配置tomc...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangxinsh55/archive/2008/03/12/185627.html'>阅读全文</a><img src ="http://www.blogjava.net/wangxinsh55/aggbug/185627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2008-03-12 11:10 <a href="http://www.blogjava.net/wangxinsh55/archive/2008/03/12/185627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat6路径配置心得</title><link>http://www.blogjava.net/wangxinsh55/archive/2007/08/11/136122.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Sat, 11 Aug 2007 15:22:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2007/08/11/136122.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/136122.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2007/08/11/136122.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/136122.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/136122.html</trackback:ping><description><![CDATA[<p><font style="BACKGROUND-COLOR: #f4f4f4">在tomcat6路径配置中，要通过对TOMCAT_HOME\conf\server.xml中的&lt;Host&gt;&lt;/Host&gt;标签中进行设置。具体是这样的：<br><br>&lt;Host name="localhost"&nbsp; appBase="E:\JavaProject\eclipse33Project\test"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unpackWARs="true" autoDeploy="true"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlValidation="false" xmlNamespaceAware="false"&gt;<br></font></p>
&lt;Host&gt;<br><br>这样将站点设置到E:\JavaProject\eclipse33Project\test目录下边。这时默认的网站根目录是ROOT。如果需要设置其它的虚拟目录，需要在TOMCAT_HOME<font face="Courier New">/conf/[enginename]/[hostname]/[网站根目录名].xml设置。<br>如在<font style="BACKGROUND-COLOR: #f4f4f4">TOMCAT_HOME</font><font face="Courier New">/conf/Catalina/localhost/WebRoot.xml下加如下内容：</font><br>&lt;Context path="/WebRoot" docBase="WebRoot" debug="0" reloadable="true"&gt;<br>&lt;/Context&gt;<br>也可以不需要设置WebRoot.xml文件，但必须要有<font style="BACKGROUND-COLOR: #f4f4f4">TOMCAT_HOME</font><font face="Courier New">/conf/Catalina/localhost的文件，这样与最初安装tomcat的webapps文件设置相同（我个人认为）</font><br><br><br>在&lt;Host&gt;&lt;/Host&gt;标签下设置&lt;Context&gt;&lt;/Context&gt;标签如下：<br><br>&lt;Host name="localhost"&nbsp; appBase="E:\JavaProject\eclipse33Project\test"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unpackWARs="true" autoDeploy="true"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlValidation="false" xmlNamespaceAware="false"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Context path="" docBase="WebRoot" debug="0" reloadable="true"&gt;&lt;/Context&gt;<br><br>&lt;Host&gt;<br><br>这样只可以设定特定的&lt;Context&gt;标签中虚拟路径。如果E:\JavaProject\eclipse33Project\test目录下还有其它的目录如App2，如果没有在&lt;Host&gt;标签下设置&lt;Context&gt;标签，则无法打开其虚拟路径。<br><br><br>
<p>所有Context的实现支持如下属性：
<table cellPadding=5 border=1>
    <tbody>
        <tr>
            <th width="15%" bgColor=#023264><font color=#ffffff>属性</font></th>
            <th width="85%" bgColor=#023264><font color=#ffffff>描述</font></th>
        </tr>
        <tr>
            <td vAlign=center align=left><code><font face=新宋体>backgroundProcessorDelay</font></code></td>
            <td vAlign=top align=left><code><font face=新宋体>这个</font></code>值代表在context及其子容器（包括所有的wrappers）上调用backgroundProcess方法的延时，以秒为单位。如果延时值非负，子容器不会被调用，也就是说子容器使用自己的处理线程。如果该值为正，会创建一个新的线程。在等待指定的时间以后，该线程在主机及其 子容器上调用backgroundProcess方法。context利用后台处理session过期，监测类的变化用于重新载入。如果没有指定，该属性的缺省值是－1，说明context依赖其所属的Host的后台处理。</td>
        </tr>
        <tr>
            <td vAlign=center align=left><code><font face=新宋体>className</font></code></td>
            <td vAlign=top align=left>实现的Java类名。该类必须实现<code><font face=新宋体>org.apache.catalina.Context</font></code>接口。如果没有指定，使用标准实现（在下面定义）。</td>
        </tr>
        <tr>
            <td vAlign=center align=left><code><font face=新宋体>cookies</font></code></td>
            <td vAlign=top align=left>
            <p>如果想利用cookies来传递session identifier（需要客户端支持cookies），设为ture。否则为false，这种情况下只能依靠URL Rewriting传递session identifier。</p>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=center align=left><code><font face=新宋体>crossContext</font></code></td>
            <td vAlign=top align=left>
            <p>如果想在应用内调用ServletContext.getContext()来返回在该虚拟主机上运行的其他web application的request dispatcher,设为true。在安全性很重要的环境中，设为false，使得getContext()总是返回null。缺省值为false。</p>
            </td>
        </tr>
        <tr>
            <td vAlign=center align=left><strong><code><font face=新宋体>docBase</font></code></strong></td>
            <td vAlign=center align=left>
            <p>该web应用的文档基准目录（Document Base，也称为Context Root），或者是WAR文件的路径。可以使用绝对路径，也可以使用相对于context所属的Host的appBase路径。</p>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=center align=left><code><font face=新宋体>override</font></code></td>
            <td vAlign=center align=left>
            <p>如果想利用该Context元素中的设置覆盖DefaultContext中相应的设置，设为true。缺省情况下使用DefaultContext中的设置。</p>
            </td>
        </tr>
        <tr>
            <td vAlign=center align=left><code><font face=新宋体>privileged</font></code></td>
            <td vAlign=center align=left>
            <p>设为true，允许context使用container servlets，比如manager servlet。</p>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=center align=left><strong><code><font face=新宋体>path</font></code></strong></td>
            <td vAlign=top align=left>
            <p>web应用的context路径。catalina将每个URL的起始和context path进行比较，选择合适的web应用处理该请求。特定Host下的context path必须是惟一的。如果context path为空字符串（""），这个context是所属Host的缺省web应用,用来处理不能匹配任何context path的请求。</p>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=center align=left><code><font face=新宋体>reloadable</font></code></td>
            <td vAlign=top align=left>如果希望Catalina监视/WEB-INF/classes/和/WEB-INF/lib下面的类是否发生变化，在发生变化的时候自动重载web application，设为true。这个特征在开发阶段很有用，但也大大增加了服务器的开销。因此，在发布以后，不推荐使用。但是，你可以使用Manager应用在必要的时候触发应用的重载。</td>
        </tr>
        <tr>
            <td vAlign=center align=left><code><font face=新宋体>wrapperClass</font></code></td>
            <td vAlign=center align=left>
            <p>org.apache.catalina.Wrapper实现类的名称，用于该Context管理的servlets。如果没有指定，使用标准的缺省值。</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
</font>
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/136122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2007-08-11 23:22 <a href="http://www.blogjava.net/wangxinsh55/archive/2007/08/11/136122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>