场景:
目前公司部署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. 按照上面的思路进行操作。