Java实现加载第三方jar包
1. 提供公共的结构jar
例如:interface-lib.jar
jar包中放 class文件
package com.itstyle.seckill.common.api;
public interface CustomRequest{
Map<String,Object> customRequest(Map<String,Object> map);
}
2.导入公共jar
main/resource下面新建lib放interface-lib.jar包
<dependencies>
<dependency>
<groupId>interface.lib</groupId>
<artifactId>interface</artifactId>
<version>0.0.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/interface-lib.jar</systemPath>
</dependency>
</dependencies>
<resources>
<resource>
<directory>src/main/resources/lib</directory>
<targetPath>BOOT-INF/lib/</targetPath>
<includes>
<include>interface-lib.jar</include>
</includes>
</resource>
</resources>
3.应用
package com.itstyle.seckill.common.classLoad;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.List;
public class ParentLastURLClassLoader extends ClassLoader{
private ChildURLClassLoader childURLClassLoader;
private static class FindClassLoader extends ClassLoader{
public FindClassLoader(ClassLoader parent){
super(parent);
}
@Override
public Class<?> findClass(String name ) throws ClassNotFoundException{
return super.findClass(name);
}
}
private static class ChildURLClassLoader extends URLClassLoader{
private FindClassLoader realParent;
public ChildURLClassLoader(URL[] urls, FindClassLoader parent) {
super(urls, null);
this.realParent = parent;
}
@Override
public Class<?> findClass(String name ) throws ClassNotFoundException{
try {
return super.findClass(name);
}catch (ClassNotFoundException e){
return realParent.loadClass(name);
}
}
}
public ParentLastURLClassLoader(List<URL> classPath){
super(Thread.currentThread().getContextClassLoader());
URL [] urls = classPath.toArray(new URL[classPath.size()]);
childURLClassLoader = new ChildURLClassLoader(urls,new FindClassLoader(this.getParent()));
}
@Override
protected synchronized Class<?> loadClass(String name,boolean resolve) throws ClassNotFoundException{
try {
return childURLClassLoader.findClass(name);
}catch (ClassNotFoundException e){
return super.loadClass(name,resolve);
}
}
}
package com.itstyle.seckill.common.classLoad;
public class CustomProcess {
private static String custompath = "/aicr/sd/custom.jar"; // load jar path
private static String classPath = "com.li.loaderJAR"; // load class path
private static String customJarName = "custom.jar"; // load jar name
public void processCustomFor(Map map) throws Exception {
ParentLastURLClassLoader classLoader = new ParentLastURLClassLoader(Arrays.asList(new File(custompath+classPath).toURI().toURL()));
Class<?> carClass = classLoader.loadClass(customJarName);
CustomRequest customRequest = (CustomRequest)carClass.newInstance();
return customRequest.proCess(map);
}
}