package com.baidu.disconf.core.common.utils;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLDecoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* ClassLoaderUtil
*/
public final class ClassLoaderUtil {
protected static final Logger LOGGER = LoggerFactory
.getLogger(ClassLoaderUtil.class);
// class path
private static String classPath = "";
// loader
private static ClassLoader loader = Thread.currentThread().getContextClassLoader();
private ClassLoaderUtil() {
}
//
// get class path
//
static {
if (loader == null) {
LOGGER.info("using system class loader!");
loader = ClassLoader.getSystemClassLoader();
}
try {
java.net.URL url = loader.getResource("");
// get class path
File f=new File(url.toURI());
classPath = f.getAbsolutePath();
classPath = URLDecoder.decode(classPath, "utf-8");
// 如果是jar包内的,则返回当前路径
if (classPath.contains(".jar!")) {
LOGGER.warn("using config file inline jar!" + classPath);
classPath = System.getProperty("user.dir");
//
addCurrentWorkingDir2Classpath(classPath);
}
} catch (Exception e) {
LOGGER.warn("cannot get classpath using getResource(), now using user.dir");
classPath = System.getProperty("user.dir");
//
addCurrentWorkingDir2Classpath(classPath);
}
LOGGER.info("classpath: {}", classPath);
}
/**
* only support 1.7 or higher
* http://stackoverflow.com/questions/252893/how-do-you-change-the-classpath-within-java
*/
private static void addCurrentWorkingDir2Classpath(String path2Added) {
// Add the conf dir to the classpath
// Chain the current thread classloader
URLClassLoader urlClassLoader;
try {
urlClassLoader = new URLClassLoader(new URL[] {new File(path2Added).toURI().toURL()},
loader);
// Replace the thread classloader - assumes
// you have permissions to do so
Thread.currentThread().setContextClassLoader(urlClassLoader);
} catch (Exception e) {
LOGGER.warn(e.toString());
}
}
public static String getClassPath() {
return classPath;
}
public static ClassLoader getLoader() {
return loader;
}
}