`
yutiansky
  • 浏览: 193107 次
  • 性别: Icon_minigender_1
  • 来自: 本溪
社区版块
存档分类
最新评论

(tomcat中级)应用Tomcat的WebappClassLoader加载指定目录的jar文件

阅读更多

要点

  1. 用WebappClassLoader::addRepository就可以实现。不用扩展WebappClassLoader类。
  2. 当ServletContextListener::contextInitialized时,调用addRepository。
  3. 在各个context-param中指定jar所在路径。

ServletContextListener

package cn.net.tianyu.classloader.servlet;

import java.io.File;
import java.io.FilenameFilter;
import java.net.MalformedURLException;
import java.util.StringTokenizer;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.catalina.loader.WebappClassLoader;

public class ClassLoadListener implements ServletContextListener {

	private static final String CONTEXT_PARAM_NAME_EXTLIBPATH = "net.tianyu.servlet.extlibs";

	@Override
	public void contextInitialized(ServletContextEvent event) {
		ServletContext context = event.getServletContext();
		addJar(context);
	}

	@Override
	public void contextDestroyed(ServletContextEvent event) {

	}

	synchronized private void addJar(ServletContext context) {

		String extlibs = context.getInitParameter(CONTEXT_PARAM_NAME_EXTLIBPATH);

		if (extlibs == null || extlibs.length() == 0)
			return;

		WebappClassLoader loader = (WebappClassLoader) getClass().getClassLoader();

		StringTokenizer st = new StringTokenizer(extlibs, ",");
		while (st.hasMoreTokens()) {
			String jarPath = st.nextToken();
			String jarRealPath = context.getRealPath(jarPath);

			File jarDir = new File(jarRealPath);
			if (!jarDir.isDirectory())
				continue;
			File[] jarFiles = jarDir.listFiles(new JarFileNameFilter());
			for (File jarFile : jarFiles) {
				try {
					loader.addRepository(jarFile.toURI().toURL().toString());
				} catch (MalformedURLException e) {
				}
			}
		}
	}

	class JarFileNameFilter implements FilenameFilter {
		public boolean accept(File dir, String name) {
			return name.toLowerCase().endsWith(".jar");
		}
	}

}

 web.xml

<?xml version="1.0" encoding="Shift_JIS"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
  <context-param>
    <param-name>net.tianyu.servlet.extlibs</param-name>
    <param-value>/../../extlib,/../../otherlib</param-value>
  </context-param>

  <listener>
    <listener-class>cn.net.tianyu.classloader.servlet.ClassLoadListener</listener-class>
  </listener>

	<servlet>
		<servlet-name>sample</servlet-name>
		<servlet-class>cn.net.tianyu.classloader.servlet.SampleServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>sample</servlet-name>
		<url-pattern>/sample</url-pattern>
	</servlet-mapping>
</web-app>
分享到:
评论
4 楼 mahengyang 2011-09-16  
为什么用tomcat启动web工程时需要将用到的jar包都放在WEB-INF/lib目录下呢?我在工程里的BuildPath里也设置了需要的jar包的路径,但是程序运行后还是会报出CLASSNOTFOUNDEXCEPTION,当我把所有的jar包都放到WEB-INF/lib下面后就好了。
3 楼 stevendu 2009-09-10  
问题找到了,我应该在部署后的lib中删除catalina.jar
2 楼 stevendu 2009-09-09  
难道是我的jar包用错了? 我用的catalina.jar啊。
1 楼 stevendu 2009-09-09  
执行到 WebappClassLoader loader = (WebappClassLoader) getClass().getClassLoader(); 时报错!
严重: Exception sending context initialized event to listener instance of class com.zoove.dcp.jars.JarLoaderListener
java.lang.ClassCastException: org.apache.catalina.loader.WebappClassLoader cannot be cast to org.apache.catalina.loader.WebappClassLoader
at com.zoove.dcp.jars.JarLoaderListener.addJar(JarLoaderListener.java:35)
at com.zoove.dcp.jars.JarLoaderListener.contextInitialized(JarLoaderListener.java:25)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4350)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:924)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:887)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1147)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
2009-9-9 23:41:47 org.apache.catalina.core.StandardContext start
严重: Error listenerStart
2009-9-9 23:41:47 org.apache.catalina.core.StandardContext start
严重: Context [/dcp] startup failed due to previous errors

相关推荐

    spring-instrument-tomcat-4.3.14.RELEASE.jar

    Tomcat's WebappClassLoader is currently not instrumentable, so Spring provides a custom ClassLoader that can be used by placing spring-instrument-tomcat.jar in $TOMCAT_HOME/lib and putting a loader ...

    Tomcat 检测内存泄漏实例详解

    这个要从热部署开始说起,因为tomcat提供了不必重启容器而只需重启web应用以达到热部署的功能,其实现是通过定义一个WebappClassLoader类加载器,当热部署时就将原来的类加载器废弃并重新实例化一个WebappCl

    how-tomcat-works

    18.4.2 安装一个war文件或目录 147 18.4.3 启动context 148 18.4.4 停止一个context 149 第19章 Manager Servlet 150 19.1 概述 150 19.2 使用Manager应用 150 19.3 ContainerServlet接口 151 19.4 初始化...

    How Tomcat Works: A Guide to Developing Your Own Java Servlet Container

    18.4.2 安装一个war文件或目录 147 18.4.3 启动context 148 18.4.4 停止一个context 149 第19章 Manager Servlet 150 19.1 概述 150 19.2 使用Manager应用 150 19.3 ContainerServlet接口 151 19.4 初始化...

    spring的jar包解决:DispatcherServlet

    Error loading WebappClassLoader org.springframework.web.servlet.DispatcherServlet java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet at org.apache.catalina.loader....

    Problem with WebappClassLoader in background thread

    NULL 博文链接:https://pingfang.iteye.com/blog/1178075

    借助Ehcache缓存框架实现对页面的缓存Demo

    1、ehcache.xml和ehcache.xsd两个文件可以在下在下载下来的名为“ehcache-core-x.x.x-distribution.tar.gz”压缩文件中找到 2、由于要实现Ehcache缓存页面,所以必须要添加“ehcache-web-2.0.4.jar” jar包,该jar包...

    Proxool-0.9.1

    改jar名称为:proxool-0.9.1.1,主要修改为以下3点: 1.解决不能Unregister jdbc driver的内存泄露问题。 十二月 02, 2013 8:19:43 上午 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc ...

    JettyWebSocketTest2

    JettyWebSocketTest2 此存储库说明了使用 Web 套接字时 Jetty 9.2.6 类加载中的问题。 要复制问题: git 克隆 cd JettyWebSocketTest2 ... 因此,从 Web 应用程序的 Jar 中查找类路径上的资源将失败。

    commons-beanutils-1.7.0

    java.lang.SecurityException: class "org.apache.commons.collections.SequencedHashMap... at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Unknown Source)

    信息: Deploying web application directory lx01

    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361) at org.apache.catalina....

Global site tag (gtag.js) - Google Analytics