我加載的方法是:
//參數fileName是jar包的路徑,processorName 是業務類的包名+類名
public static A load(String fileName, String processorName) {
String filePath = fileName;
A processor = null;
URL url;
try {
url = new URL(filePath);
} catch (MalformedURLException e1) {
e1.printStackTrace();
log.error("文件不存在");
return null;
}
URLClassLoader loader = new URLClassLoader(new URL[] { url });
try {
Class<?> processorClass = loader.loadClass(processorName);
processor = (A)processorClass.newInstance();
} catch (Exception e) {
log.error("創建業務類失敗");
e.printStackTrace();
return null;
}
return processor;
}
問題:用main方法來調用這個load方法是能加載jar包中業務類a的,但是如果在自己系統里面按照正常流程走的時候調用load方法的時候 卻報錯:接口類A找不到, 但是接口類A是明明定義在系統內部的,(兩次調用load方法的入參都是一樣的)
解決方法:
parentClassLoader,即Thread.currentThread().getContextClassLoader(),就能從當前程序中查找接口類A
package com.main.java; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; /** */ public class TestClassLoad2 { private static Logger LOGGER = LoggerFactory.getLogger(TestClassLoad2.class); public static void main(String[] args) { args=new String[]{"file://F:/bin/lib/test.jar","com.main.java.TestProcess"}; LOGGER.info("start"); load(args[0],args[1]); } public static Process load(String fileName, String processorName) { String filePath = fileName; Process processor = null; URL url; try { url = new URL(filePath); } catch (MalformedURLException e1) { e1.printStackTrace(); LOGGER.info("文件不存在"); return null; } URLClassLoader loader = new URLClassLoader(new URL[]{url},Thread.currentThread().getContextClassLoader()); //URLClassLoader loader = new URLClassLoader(new URL[] { url }); try { Class<?> processorClass = loader.loadClass(processorName); processor = (Process)processorClass.newInstance(); processor.display(); } catch (Exception e) { LOGGER.info("創建業務類失敗"); e.printStackTrace(); return null; } return processor; } }
package com.main.java; public interface Process { void display(); }
另一個jar包的類
package com.main.java; public class TestProcess implements Process { @Override public void display() { System.out.println("test testProcess"); } }
注意事項: 兩個jar包的Process接口,包路徑必須一致
file://F:/bin/lib/ 也可以