您的位置:首页 > 运维架构 > Tomcat

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

2015-09-20 00:27 741 查看
原文:http://dncsoft.iteye.com/blog/336871


要点

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


ServletContextListener

Java代码


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代码


<?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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: