`
yutiansky
  • 浏览: 198846 次
  • 性别: 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

相关推荐

    Tomcat7 负载Jar包

    4. **使用WebAppClassLoader**:针对特定应用的JAR,应放在Web应用的`WEB-INF/lib`下,由WebAppClassLoader加载。 **三、配置文件详解** 1. **server.xml**:这是Tomcat的主要配置文件,包含了Server、Service、...

    tomcat6异常问题

    7. **使用隔离的类加载器**:通过设置不同的类加载策略,例如Web应用的`WebappClassLoader`,可以避免不同应用之间的jar冲突。 8. **社区支持**:在Apache Tomcat的官方论坛或Stack Overflow等技术社区提问,获取...

    Tomcat 5.0.18 ClassLoader source code insight

    4. WebApp ClassLoader:每个Web应用都有自己的ClassLoader,它负责加载应用的WEB-INF/classes和WEB-INF/lib下的类。 在Tomcat 5.0.18的源码中,我们可以看到这些ClassLoader是如何协同工作的。例如,`org.apache....

    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 类加载器的实现方法及实例代码

    - WebappX类加载器:每个Web应用都有一个对应的WebappX类加载器,父加载器是Shared,主要负责加载应用的/WEB-INF/classes目录下的class和/WEB-INF/lib目录中的jar包。 - JasperLoader:用于加载JSP编译后的class文件...

    WEB-INF下的lib下的子目录中的jar包不能自动发布的问题的解决办法

    4. **使用类加载器策略**:在某些情况下,应用服务器的类加载策略可能会影响从特定目录加载JAR文件。例如,Tomcat有WebAppClassLoader,它按照一定的顺序加载类。理解并调整服务器的类加载策略可能能解决问题。 5. ...

    找出Web程序依赖的所有的JAR

    在Web应用中,`WebappClassLoader`是一个关键的类加载器,它是Tomcat等应用服务器专门为每个Web应用实例实现的。`WebappClassLoader.class`是这个类加载器的主类,它负责加载Web应用上下文中的所有类和资源。`...

    tomcat8.0.0-RC5源码官方

    `bin`目录包含了启动和停止Tomcat的脚本,`conf`包含配置文件,如`server.xml`和`context.xml`,`lib`存放必要的JAR库,`webapps`是部署Web应用的地方,而`work`则存储了Servlet编译后的类文件和临时文件。...

    Java类加载

    - 默认的类加载器,负责加载应用 classpath 中的类。 #### 五、双亲委派模型 双亲委派模型是 Java 类加载器的核心设计原则之一,它的目的是为了保证类的唯一性以及提高安全性。具体工作流程如下: 1. 如果一个类...

    浅谈java项目与javaweb项目导入jar包的区别

    4. webapps.webappClassLoader(加载WEB-INF下的JAR) 因此,在JavaWeb项目中,需要将JAR包导入到WEB-INF下的lib文件夹中,以便服务器可以加载JAR包。如果将JAR包导入到User Library中,那么服务器将无法加载JAR包...

    张孝祥J2SE加强自学笔记(48-56)

    当一个Servlet被打包成.Jar文件放入JRE的lib/ext目录下,由ExtClassLoader加载时,会引发错误。这是因为在Java的双亲委派模型中,加载请求会从顶级类加载器(ExtClassLoader)向下传递,如果父类加载器找不到,子类...

    Jetty权威指南.pdf

    - **WebAppClassLoader**:为每个Web应用提供独立的类加载器,确保应用之间的隔离。 - **ParentLoader**:继承自BaseLoader,用于加载公共类库。 通过这种设计,Jetty实现了良好的类加载器层次结构,既保证了应用的...

    借助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包...

Global site tag (gtag.js) - Google Analytics