Java有个比较傻的地方,没有提供从程序目录加载jar包的功能,包括class-path等的配置,全部基于【相对于当前工作目录路径】和【绝对路径】两种,并没有【相对于程序路径】。
网上找了一些资料,东拼西凑把这个功能实现了。在需要的时候调用即可。
1package example.autoload; 2 3import java.io.File; 4import java.lang.reflect.Method; 5import java.net.URL; 6import java.net.URLClassLoader; 7 8public class Utils { 9 public static String getApplicationFolder() { 10 String path = Utils.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 11 return new File(path).getParent(); 12 } 13 14 public static void loadJarsFromAppFolder(String sub_folder) throws Exception { 15 String path = getApplicationFolder() + File.pathSeparator + sub_folder; 16 File f = new File(path); 17 if (f.isDirectory()) { 18 for (File subf : f.listFiles()) { 19 if (subf.isFile()) { 20 loadJarFile(subf); 21 } 22 } 23 } else { 24 loadJarFile(f); 25 } 26 } 27 28 public static void loadJarFile(File path) throws Exception { 29 URL url = path.toURI().toURL(); 30 URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); 31 Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); 32 method.setAccessible(true); 33 method.invoke(classLoader, url); 34 } 35} 36 37 38package example.autoload; 39 40public class test { 41 42 public static void main(String[] args) { 43 try { 44 Utils.loadJarsFromAppFolder("lib"); 45 } catch (Exception e) { 46 e.printStackTrace(); 47 } 48 } 49 50}