应用Tomcat的WebappClassLoader加载指定目录的jar文件
2015-09-20 00:27
741 查看
原文:http://dncsoft.iteye.com/blog/336871
用WebappClassLoader::addRepository就可以实现。不用扩展WebappClassLoader类。
当ServletContextListener::contextInitialized时,调用addRepository。
在各个context-param中指定jar所在路径。
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");
}
}
}
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>
要点
用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>
相关文章推荐
- tomcat源码分析 StandardServer初始化过程
- CentOS 安装tomcat 7
- 配置Tomcat服务
- Tomcat详细用法学习(四)
- Tomcat剖析(三):连接器(2)
- LINUX 下 tomcat的安装和配置
- tomcat虚拟主机配置
- tomcat配置虚拟目录
- Tomcat详细用法学习(三)
- Tomcat免安装配置2
- CentOS 7 Tomcat路径
- Tomcat 端口、默认应用、域名配置实践
- 使用 CAS 在 Tomcat 中实现单点登录
- Tomcat(8005,8080,8009)端口占用问题常见原因及解决方法
- 部署在 Tomcat 下推荐方法
- CentOS6.6 安装JDK8+TOMCAT8+MYSQL
- Ubuntu 12.04.5 简单快捷安装jdk + tomcat +Mysql
- Tomcat详细用法学习(二)
- tomcat的Jsp执行
- linux下配置开发环境,mysql+jdk+tomcat