应用Tomcat的WebappClassLoader加载指定目录的jar文件

原文:http://dncsoft.iteye.com/blog/336871

要点

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

ServletContextListener

Java代码   收藏代码
  1. package cn.net.tianyu.classloader.servlet;  
  2.   
  3. import java.io.File;  
  4. import java.io.FilenameFilter;  
  5. import java.net.MalformedURLException;  
  6. import java.util.StringTokenizer;  
  7.   
  8. import javax.servlet.ServletContext;  
  9. import javax.servlet.ServletContextEvent;  
  10. import javax.servlet.ServletContextListener;  
  11.   
  12. import org.apache.catalina.loader.WebappClassLoader;  
  13.   
  14. public class ClassLoadListener implements ServletContextListener {  
  15.   
  16.     private static final String CONTEXT_PARAM_NAME_EXTLIBPATH = "net.tianyu.servlet.extlibs";  
  17.   
  18.     @Override  
  19.     public void contextInitialized(ServletContextEvent event) {  
  20.         ServletContext context = event.getServletContext();  
  21.         addJar(context);  
  22.     }  
  23.   
  24.     @Override  
  25.     public void contextDestroyed(ServletContextEvent event) {  
  26.   
  27.     }  
  28.   
  29.     synchronized private void addJar(ServletContext context) {  
  30.   
  31.         String extlibs = context.getInitParameter(CONTEXT_PARAM_NAME_EXTLIBPATH);  
  32.   
  33.         if (extlibs == null || extlibs.length() == 0)  
  34.             return;  
  35.   
  36.         WebappClassLoader loader = (WebappClassLoader) getClass().getClassLoader();  
  37.   
  38.         StringTokenizer st = new StringTokenizer(extlibs, ",");  
  39.         while (st.hasMoreTokens()) {  
  40.             String jarPath = st.nextToken();  
  41.             String jarRealPath = context.getRealPath(jarPath);  
  42.   
  43.             File jarDir = new File(jarRealPath);  
  44.             if (!jarDir.isDirectory())  
  45.                 continue;  
  46.             File[] jarFiles = jarDir.listFiles(new JarFileNameFilter());  
  47.             for (File jarFile : jarFiles) {  
  48.                 try {  
  49.                     loader.addRepository(jarFile.toURI().toURL().toString());  
  50.                 } catch (MalformedURLException e) {  
  51.                 }  
  52.             }  
  53.         }  
  54.     }  
  55.   
  56.     class JarFileNameFilter implements FilenameFilter {  
  57.         public boolean accept(File dir, String name) {  
  58.             return name.toLowerCase().endsWith(".jar");  
  59.         }  
  60.     }  
  61.   
  62. }  

 web.xml

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="Shift_JIS"?>  
  2.   
  3. <!DOCTYPE web-app  
  4.     PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  
  5.     "http://java.sun.com/dtd/web-app_2_3.dtd">  
  6.   
  7. <web-app>  
  8.   <context-param>  
  9.     <param-name>net.tianyu.servlet.extlibs</param-name>  
  10.     <param-value>/../../extlib,/../../otherlib</param-value>  
  11.   </context-param>  
  12.   
  13.   <listener>  
  14.     <listener-class>cn.net.tianyu.classloader.servlet.ClassLoadListener</listener-class>  
  15.   </listener>  
  16.   
  17.     <servlet>  
  18.         <servlet-name>sample</servlet-name>  
  19.         <servlet-class>cn.net.tianyu.classloader.servlet.SampleServlet</servlet-class>  
  20.     </servlet>  
  21.     <servlet-mapping>  
  22.         <servlet-name>sample</servlet-name>  
  23.         <url-pattern>/sample</url-pattern>  
  24.     </servlet-mapping>  
  25. </web-app>  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值