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