package com.wangyin.ak47.common;
import java.io.File;
import java.io.FilenameFilter;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import com.wangyin.ak47.common.DynamicClassLoader;
/**
* Package-related helper class
*
* 包路径相关辅助类
*
* @author hannyu
*
*/
public class PackageUtil {
/**
* Simplify a Class or Package full name, such as:
*
* com.wangyin.ak47.common.PackageUtil {@code ===>} c.w.a.c.PackageUtil
*
* 简化一个类或包的路径,为了避免太长。
*
* @param classname
* @return
*/
public static String simplifyName(String classname){
String[] cns = classname.split("\\.");
StringBuilder sb = new StringBuilder(32);
for(int i=0; i<cns.length-1; i++){
sb.append(cns[i].charAt(0)).append(".");
}
sb.append(cns[cns.length-1]);
return sb.toString();
}
private static final String CLASSPATH_SEPARATOR = System.getProperty("path.separator");// $NON-NLS-1$
private static final String JAVA_CLASS_PATH = "java.class.path";
private static final String OS_NAME = System.getProperty("os.name");// $NON-NLS-1$
private static final String OS_NAME_LC = OS_NAME.toLowerCase(java.util.Locale.ENGLISH);
private static final boolean usesUNC = OS_NAME_LC.startsWith("windows");// $NON-NLS-1$
/**
* add one or many jars to the context ClassLoader.
*
* 动态加载jar包
*
* @param jarfile a jar file or a directory which includes some jars (not include subdirectories).
*/
public static void addExtJars(String jarfile){
File libDir = new File(jarfile);
if( !libDir.exists() ){
return;
}
List<URL> jars = new LinkedList<URL>();
StringBuilder classpaths = new StringBuilder();
// jarDir is a file
if( libDir.isFile() ){
try {
jars.add(libDir.toURI().toURL());
classpaths.append(CLASSPATH_SEPARATOR);
classpaths.append(libDir.getPath());
} catch (MalformedURLException e) {
e.printStackTrace();
}
return;
}
// jarDir is a directory
File[] libJars = libDir.listFiles(new FilenameFilter(){
@Override
public boolean accept(File dir, String name) {
if( name.endsWith(".jar") ){ // $NON-NLS-1$
File jar = new File(dir, name);
return jar.isFile() && jar.canRead();
}
return false;
}
});
if (libJars == null) {
new Throwable("Could not access " + libDir).printStackTrace();
return;
}
Arrays.sort(libJars);
for (File libJar : libJars) {
try {
String s = libJar.getPath();
// Fix path to allow the use of UNC URLs
if (usesUNC) {
if (s.startsWith("\\\\") && !s.startsWith("\\\\\\")) {// $NON-NLS-1$ $NON-NLS-2$
s = "\\\\" + s;// $NON-NLS-1$
} else if (s.startsWith("//") && !s.startsWith("///")) {// $NON-NLS-1$ $NON-NLS-2$
s = "//" + s;// $NON-NLS-1$
}
} // usesUNC
jars.add(new File(s).toURI().toURL());// See Java bug 4496398
classpaths.append(CLASSPATH_SEPARATOR);
classpaths.append(s);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}//for
// update loader
DynamicClassLoader.updateLoader(jars);
classpaths.append(CLASSPATH_SEPARATOR);
classpaths.append(System.getProperty(JAVA_CLASS_PATH));
System.setProperty(JAVA_CLASS_PATH, classpaths.toString());
}
}