Tomcat 中自定义Context Loader

一. 问题

 

 在开发若干个类似项目的时候,通常这些 Webapp 的lib 都是一样的,可以将其放到一个公共的目录,这样部署的应用就会小很多。

 

比如 一个带有Spirng + JPA 的通常Lib 都在 16M,自己写的代码不过 几百K而已。

 

  所以可以将 Spring 的lib 放到Tomcat 目录下,使得所有的Webapp 能够共享。

 

  但由于每个Webapp 的 lib 都需要加载到不同的Classloader里,所以放到 Tomcat/Lib 或者 Tomcat/common 里都是不对的。

 

 

二. 自定义Loader

 

package tomcat6.patch; import java.io.File; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.catalina.Container; import org.apache.catalina.core.StandardContext; public class WebappLoader extends org.apache.catalina.loader.WebappLoader { private Logger logger = Logger.getLogger(WebappLoader.class.getName()); @Override public void setContainer(Container container) { if (container instanceof StandardContext) { StandardContext ctx = (StandardContext) container; try { // add jar into classpath File repoBase = new File(System.getProperty("catalina.home"), "lib.ext"); for (File file : repoBase.listFiles()) { if (file.isDirectory()) { continue; } if (file.getName().endsWith(".jar")) { logger.fine("add library: " + file.toURI().toString() + " to conext " + ctx.getPath()); addRepository(file.toURI().toString()); } } } catch (Exception ex) { logger.log(Level.SEVERE, null, ex); } } super.setContainer(container); } }  

 

通过自定义Loader,使得 每个Webapp 被启动的时候,都会加载Tomcat/libext 目录下的所有jar ,每个Webapp 互不干扰,达到了木的。

 

 

三.配置

 

  如果要全局,可以修改 Tomcat/conf/context.xml ,或者 指定webapp的context.xml 

 

 

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Context> <Context> <!-- Default set of monitored resources --> <WatchedResource>WEB-INF/web.xml</WatchedResource> <!-- Uncomment this to disable session persistence across Tomcat restarts --> <!-- <Manager pathname="" /> --> <!-- Uncomment this to enable Comet connection tacking (provides events on session expiration as well as webapp lifecycle) --> <!-- <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" /> --> <Loader className="tomcat6.patch.WebappLoader" /> </Context> 

 

你可能感兴趣的:(tomcat,exception,ClassLoader,session,Comet,webapp)