`

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下的lib下的jar包

    标题中的“tomcat下的lib下的jar包”指的是Apache Tomcat服务器中的`lib`目录下的Java Archive (JAR) 文件。Tomcat是一个流行的开源Web应用程序服务器,遵循Java Servlet和JavaServer Pages(JSP)规范。在Tomcat的...

    tomcat 中运行php 环境的jar包

    - 将上述提到的JAR文件添加到Tomcat的lib目录下,确保Tomcat在启动时能加载这些库。 - 配置Tomcat的web.xml文件,设置PHPServlet的相关配置,包括Servlet的映射路径等。 - 在Tomcat的工作目录下,创建一个存放PHP...

    tomcat-juli.jar和tomcat-juli-adapters.jar

    在实际应用中,通常将`tomcat-juli.jar`添加到Tomcat的`lib`目录下,这样服务器启动时会自动加载该日志系统。而`tomcat-juli-adapters.jar`则根据需要进行选择性加载,如果应用使用了特定的日志框架,那么将这个...

    tomcat 部署java项目 jar

    - 将JAR文件放入`$CATALINA_HOME/lib`目录,这样Tomcat会自动加载其中的Servlet和过滤器。 - 将JAR文件放入`$CATALINA_HOME/webapps/WEB-INF/lib`目录,适合小型独立应用。 - 创建WAR(Web ARchive)文件,然后将...

    Tomcat7 负载Jar包

    5. Web Application ClassLoader:每个Web应用都有自己独立的类加载器,加载`WEB-INF/classes`和`WEB-INF/lib`目录下的类和JAR。 **二、优化JAR包加载** 1. **减少重复JAR**:检查各个Web应用的`WEB-INF/lib`目录,...

    Tomcat源码所需要jar包

    在深入探讨Tomcat源码分析之前,我们先要理解这些给定的jar包的作用和它们在Tomcat中的重要性。标题提到的是“Tomcat源码所需要jar包”,这表明我们将要讨论的是为了编译、构建或者理解Apache Tomcat源代码所必需的...

    tomcat6.0+memcached 依赖jar包

    为了添加额外的功能,如集成其他服务或框架,我们需要将对应的jar包放入Tomcat的类加载路径中,通常是`lib`目录。 接下来,我们来探讨Memcached。Memcached是一个基于内存的键值对存储系统,用于存储临时数据,如...

    tomcat-memcached所需jar包

    - 集成方式:在Tomcat的`WEB-INF/lib`目录下放置Memcached客户端的jar包,使得Web应用能够访问和操作Memcached。 2. **Memcached客户端库** - spymemcached:一个流行的Java Memcached客户端,轻量级且高效,支持...

    TOMCAT6日志配置JAR包及配置文件

    你需要将这个JAR包放到Tomcat的`lib`目录下,这样Tomcat在启动时就会加载这个库,从而使用Log4j进行日志记录。 配置文件部分,通常情况下,Log4j的配置文件名为`log4j.properties`或`log4j.xml`。这个资源包中的...

    tomcat8.5.76源码项目运行所需的jar包

    在"lib"目录下,我们可以找到以下几类重要的jar包: 1. **Servlet API**:如`servlet-api.jar`,包含了Servlet规范定义的接口和类,使得Tomcat可以处理HTTP请求和响应。 2. **JSP API**:如`jsp-api.jar`,提供了...

    comet4j 所需js以及comet4j-tomcat6.jar、comet4j-tomcat7.jar包

    开发者需要将这些JAR文件添加到Tomcat的lib目录下,以便Tomcat在启动时自动加载,从而支持Comet4j的HTTP长连接特性。值得注意的是,`comet4j-tomcat6.jar`适用于Tomcat 6版本,而`comet4j-tomcat7.jar`适用于Tomcat ...

    Eclipse导入TOMCAT7源码所需jar包

    3. 将解压后的Tomcat7源码复制到项目根目录下。 4. 右键点击项目,选择“属性”&gt;“Java构建路径”&gt;“库”&gt;“添加外部JARs”,然后选择`ant.jar`, `ecj-3.5.1.jar`, `jaxrpc.jar`, 和 `wsdl4j-1.5.1.jar`。 5. 如果...

    tomcat支持跨域jar.zip

    你需要将这个JAR文件放入Tomcat的`lib`目录,确保服务器启动时能够识别并加载。 4. **重启Tomcat**:完成配置后,记得重启Tomcat服务,使新的配置生效。 5. **测试验证**:使用Ajax或其他HTTP库发起跨域请求,检查...

    tomcat8.0-jar包

    为了部署Web应用,你可以将WAR文件或解压后的应用目录放在webapps目录下,Tomcat会在启动时自动部署。 请注意,这个包不包含安装说明,因此在实际操作中可能需要查阅官方文档或在线教程。在部署生产环境时,还需要...

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

    二是直接修改Tomcat的类加载策略,使其按照字母顺序加载JAR,但这可能会影响到其他应用的正确运行。 总的来说,理解Tomcat的类加载机制对于排查和解决问题至关重要。开发者应当注意,即使使用了相同版本的Tomcat和...

    tomcat7.0+memcached 依赖jar包

    2. **添加依赖**:将下载的Memcached客户端库的jar包添加到Tomcat的`lib`目录下。这使得Tomcat在启动时可以加载这些库,使得所有部署的应用都能使用它们。 3. **配置Memcached连接**:在你的Java代码中,你需要创建...

    运行tomcat源码所要添加的jar包

    在导入这些jar包到Tomcat项目时,通常会将其放置在`WEB-INF/lib`目录下,这样Tomcat在启动时会自动扫描并加载这些库。如果使用的是构建工具如Maven或Gradle,可以通过配置依赖管理来自动化这个过程。在开发过程中,...

    tomcat7+redis单点 session共享jar

    1. 将JAR文件添加到Tomcat的`lib`目录下,使其可被服务器加载。 2. 配置Tomcat的`context.xml`或`server.xml`,指定使用Redis作为session存储。 3. 设置Redis连接参数,如主机地址、端口、密码等。 4. 重启Tomcat...

    Java 类在 Tomcat 中是如何加载的(过程分析)

    当Tomcat加载类时,它遵循以下顺序: - 使用Bootstrap类加载器尝试加载。 - 使用System类加载器尝试加载。 - 使用Webapp类加载器加载`WEB-INF/classes`下的类。 - 使用Webapp类加载器加载`WEB-INF/lib`中的jar...

    解决tomcat跨域问题的jar包

    首先,我们需要将cors-filter-1.7.jar添加到Tomcat的lib目录下,这是Tomcat服务器加载第三方库的地方。然后,我们需要配置web.xml文件,这是一个描述Web应用配置的文件,位于Web应用的WEB-INF目录下。在web.xml中,...

Global site tag (gtag.js) - Google Analytics