URLClassLoader初体验

使用概要:
​File file = new File(jar文件全路径); 
​URL url = file.toURL(); 
​URLClassLoader loader = new URLClassLoader(new URL[] { url });
​Class tidyClazz = loader.loadClass(所需class的含包名的全名);

笔者案例:



示例代码:

log4j.properties文件代码如下:
log4j.rootLogger=debug,appender1
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout


JarLoadUtil.java文件代码如下:
package com.shihuan.urlclassloader;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

import org.apache.commons.lang.SystemUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class JarLoadUtil {

	private static Logger logger = LoggerFactory.getLogger(JarLoadUtil.class);  
    private static URLClassLoader loader = null;
    
    /* 
     * 加载lib目录下所有jar文件,并返回相应的的URLClassLoader 
     */  
	public static URLClassLoader getURLClassLoader() {
		if (loader == null) {
			String fileNames[] = listFileNames();
			if (fileNames != null && fileNames.length > 0) {
				URL urls[] = new URL[fileNames.length];
				for (int i = 0; i < fileNames.length; i++) {
					try {
						StringBuilder sb = new StringBuilder();
						sb.append("file:").append(SystemUtils.FILE_SEPARATOR).append(System.getProperty("user.dir")).append(SystemUtils.FILE_SEPARATOR).append("lib");
						urls[i] = new URL(sb.toString() + SystemUtils.FILE_SEPARATOR + fileNames[i]);
					} catch (MalformedURLException e) {
						logger.error("加载lib目录下jar文件出错!", e);
						throw new RuntimeException("加载lib目录下jar文件出错!", e);
					}
				}
				loader = new URLClassLoader(urls);
			}
		}
		return loader;
	}  
	
    /* 
     * 查询lib目录下的所有文件名称 
     */  
	private static String[] listFileNames() {
		File file_directory = new File("lib");
		return file_directory.list();
	}  
	
}


TestUrlClassLoader.java文件代码如下:
package com.shihuan.test;

import java.net.URLClassLoader;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import org.logicalcobwebs.proxool.ProxoolDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.shihuan.urlclassloader.JarLoadUtil;

public class TestUrlClassLoader {

	private static Logger logger = LoggerFactory.getLogger(TestUrlClassLoader.class);
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		URLClassLoader loader = JarLoadUtil.getURLClassLoader(); 
		
		ProxoolDataSource ds = new ProxoolDataSource();
		ds.setDriver("com.mysql.jdbc.Driver");
		ds.setDriverUrl("jdbc:mysql://localhost:3306/myword");
		ds.setUser("root");
		ds.setPassword("12345678");
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		Class<?> clazz = null;
		try {
			clazz = loader.loadClass(ds.getDriver());
			Driver driver = (Driver)clazz.newInstance();          
            
			Properties p = new Properties();  
			p.put("user", ds.getUser());  
			p.put("password", ds.getPassword());       
			              
			conn = driver.connect(ds.getDriverUrl(), p);
			
			logger.info(conn.toString());
			
			String sql = "select id,name from mytaba";
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			while (rs.next()) {
				System.out.println(rs.getInt("id") + "  --  " + rs.getString("name"));
			}
			
			rs.close();
			pstmt.close();
			conn.close();
			
		} catch (ClassNotFoundException e) {
			logger.error(e.getMessage(), e);
		} catch (InstantiationException e) {
			logger.error(e.getMessage(), e);
		} catch (IllegalAccessException e) {
			logger.error(e.getMessage(), e);
		} catch (SQLException e) {
			logger.error(e.getMessage(), e);
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (pstmt != null) {
					pstmt.close();
				}
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		} 
		
	}

}


运行TestUrlClassLoader.java文件中的main方法即可。



或者在dos窗口执行ant命令后进入%PROJECT_HOME%/dist/jar目录,执行java -jar myapp-${日期}.jar

猜你喜欢

转载自shihuan830619.iteye.com/blog/2160884