Tomcat如何加载其他目录下的jar

场景:

       目前公司部署web项目比较频繁,而且服务器网速比较慢,每次升级全量web项目比较耗时,所以能不能把通用的jar挪出来以便下次不用每次打包升级上去。

解决方法:

1. 备份一份通用的jar,每次升级时将通用的jar删除然后上传,然后部署时将jar复制到web项目下。不过每次升级需要挪出来。

2. 备份一份通用的jar,每次升级时将通用的jar删除然后上传,部署时启动Tomcat,将备份的jar加载到Tomcat中,以便以后每次升级不需任何操作。

思路:

1. 创建一个testjar.jar

2. 创建一个loadjar的web项目,依赖jar

3. maven打包javaweb项目

4. 将testjar.jar放置到其他目录下

4. 删除loadjar项目lib下testjar.jar

5. 放到tomcat下运行

6. tomcat启动时加载其他目录下的testjar.jar

实现:

1. 创建ClassLoadListener类,tomcat启动时加载jar

package loadjar;

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;

/**
 * @FileName ClassLoadListener.java
 * @Description:
 * 
 * @Date 2017年8月23日
 * @author xurl
 * @version 1.0.1
 * 
 */
public class ClassLoadListener implements ServletContextListener {

	private static final String CONTEXT_PARAM_NAME_EXTLIBPATH = "extlibs";

	@Override
	public void contextInitialized(ServletContextEvent event) {
		System.out.println("classLoadListener init...");
		ServletContext context = event.getServletContext();
		addJar(context);
	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {

	}

	synchronized private void addJar(ServletContext context) {
//获取web.xml配置的extlibs路径
		String extlibs = context.getInitParameter(CONTEXT_PARAM_NAME_EXTLIBPATH);
		System.out.println("extlibs: " + extlibs);
		if (extlibs == null || extlibs.length() == 0) {
			return;
		}
//调用tomcat中的catalina.jar包中的WebappClassLoader类加载jar
		WebappClassLoader loader = (WebappClassLoader) this.getClass().getClassLoader();

		StringTokenizer st = new StringTokenizer(extlibs, ",");
		while (st.hasMoreTokens()) {
			String jarPath = st.nextToken();
			System.out.println("jarPath: " + jarPath);
//			String jarRealPath = context.getRealPath(jarPath);

			File jarDir = new File(jarPath);
			if (!jarDir.isDirectory())
				continue;
			File[] jarFiles = jarDir.listFiles(new JarFileNameFilter());
			for (File jarFile : jarFiles) {
				System.out.println("jarFile: " + jarFile);
				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");
		}
	}

}

2. 写个TestServlet测试类,其中StringUtils中的trim是依赖于testjar.jar

package loadjar;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.myfams.testjar.util.StringUtils;

/**
 * Servlet implementation class TestServlet
 */
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public TestServlet() {
        super();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter pw = response.getWriter();
//调用testjar.jar中的StringUtils类
		pw.append(StringUtils.trim("  hello world  "));
		pw.flush();
		pw.close();
	}

}

 3. 配置web.xml

<!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>
	<display-name>Archetype Created Web Application</display-name>

	<context-param>
		<param-name>extlibs</param-name>
		<param-value>D:\\eclipseworkspace\\testjar\\testjar\\target</param-value>
	</context-param>

	<listener>
		<listener-class>loadjar.ClassLoadListener</listener-class>
	</listener>

	<servlet>
		<servlet-name>TestServlet</servlet-name>
		<display-name>TestServlet</display-name>
		<servlet-class>loadjar.TestServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>TestServlet</servlet-name>
		<url-pattern>/TestServlet</url-pattern>
	</servlet-mapping>
</web-app>

4. 按照上面的思路进行操作。

猜你喜欢

转载自weifengxuxu.iteye.com/blog/2390970