`

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. 按照上面的思路进行操作。

 

分享到:
评论

相关推荐

    tomcat 中运行php 环境的jar包

    tomcat php jar包tomcat php jar包tomcat php jar包tomcat php jar包

    Spring bean 动态注册,jar包热替换

    Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class...测试示例中是spring boot 的部分代码,动态加载的内容为接口实现类,且初始化时加载本地的实现类,动态加载后改为非程序加载目录中的jar实现类。

    tomcat8改了jar加载顺序的踩坑记录

    主要给大家介绍了关于tomcat8改了jar加载顺序的踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    Tomcat解决跨域时需要用到的Jar包

    Tomcat解决跨域时需要用到的Jar包 cors-filter-1.5.0.1.jar和java-property-utils-1.9.1.jar

    java 反射运行时加载外部jar到Tomcat StandardClassLoader1

    加载jar这一部分很容易,可是卸载jar就没那么容易了。加载jar的时候需要用反射去调用URLClassLoader的addURL方法。}%&gt;jars.jar内

    tomcat加载jar异常问题的分析与解决

    项目使用springboot启动一个web项目,在启动阶段看到console中出现了异常“1.10.3-1.4.3\hdf5.jar 系统找不到指定的文件”,虽然这些异常不影响项目的正常运行,但作为一个严谨的技术人员,看到这些异常就像见到...

    spring 重新动态加载数据库或xml中的bean,可以不用重启tomcat

    spring 重新动态加载数据库或xml中的bean,可以不用重启tomcat

    servlet-api.zip Servlet必须的Jar包

    如果你在本机上安装了Tomcat,那么这个jar包一般都在tomcat安装目录\lib 文件夹下面有,当你把web项目部署到tomcat,会自动加载这个jar包来识别Serlvet一些对象。 当然你创建的是一个普通JavaProject,那么就需要...

    修改java类而无需重启tomcat.rar

    修改tomcat安装目录下的\bin\catalina.bat文件, 增加set JAVA_OPTS=-noverify -javaagent:d:/javarebel.jar 发布项目时可设置:reloadable="false" \apache-tomcat-5.5.36\conf\Catalina\localhost 目录下.xml文件...

    MyEclipse热加载jar包.zip

    该资源是用于配置Myeclipse修改java文件后不需要重启Tomcat服务的jar包,提高开发效率。

    Solr结合Java所需Jar

    Solr结合Java所需Jar,Solr结合Java所需Jar,Solr结合Java所需Jar

    soap.war 和所需的activation.jar mail.jar soap.jar xerces.jar

    tomcat运行时会自动加载tomcat/lib下的所有类库 将soap.war放到tomcat/webapps下,重启tomcat。 会看到tomcat已经解压soap.war 到此搭建好了tomcat下的soap协议服务 测试: 输入:...

    tomcat环境变量配置

    然后修改环境变量中的classpath,把tomat安装目录下的common\lib下的servlet.jar追加到classpath中去,修改后的classpath如下: classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\...

    Tomcat无法加载css和js等静态资源文件的解决思路

    Tomcat无法加载css和js等静态资源文件的情况想必从事相关行业的工作人员都有遇到过吧,接下来为大家介绍下详细的解决方法,感兴趣的朋友可以参考下

    weblogic部署项目jar冲突解决

    在tomcat下部署成功,迁移到weblogic下,报错,一般都是配置和jar包问题,配置问题开发根据报错能解决,jar冲突比较烦人,这里给出了解决方案。

    详解tomcat热部署和热加载的方法

    详解tomcat热部署和热加载的方法 我在项目开发过程中,经常要改动Java/JSP 文件,但是又不想从新启动服务器(服务器从新启动花时间),想直接获得(debug)结果.有两种方式热部署 和热加载:  1.热加载:在server.xml...

    java.servlet的jar包

    支持servlet的jar包。应该叫servlet-api.jar 你如果编写过servlet就...如果你安装了Tomcat,这个jar包一般在tomcat安装目录\lib 文件夹下面有,当你把web项目部署到tomcat,会自动加载这个jar包来识别Serlvet一些对象。

    servlet-api2.5 jar包.rar

    servlet就知道要用到HttpServletRequest和HttpServletResponse等对象...如果你安装了Tomcat,这个jar包一般在tomcat安装目录\lib 文件夹下面有,当你把web项目部署到tomcat,会自动加载这个jar包来识别Serlvet一些对象。

Global site tag (gtag.js) - Google Analytics