动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行。

下面通过一个实例来直观演示:

第一:定义一个抽象类 AbstractAction (稍后换成接口的实例)

package com.java.loader;
public abstract class AbstractAction {
	public abstract String action();

第二:写个实体类继承一下 TestAction

package com.java.jarloader;
import com.java.loader.AbstractAction;
public class TestAction extends AbstractAction{
	public String action() {
		System.out.println("I am working ! ");
		return "this ActionTest class";

第三:将TestAction所在的包导出成jar包的方式,eclipse中直接export即可,放到指定目录,此处放在

D:\jarload\test.jar


放好后,删除TestAction文件和package。

第四:写个main函数测试下 TestMain (这里比较无聊,写了个从文件读的方式获取jar路劲,路径就是上面提到的jar所在的位置)

package com.java.main;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.net.URL;
import java.net.URLClassLoader;
import com.java.loader.AbstractAction;
import com.java.loader.AbstractAction;
 * 两种方式
public class TestMain {
	public static void main(String[] args) {
		try {
			//第一种  配置成文件格式
			File file = new File("D:\\jarload\\test.txt");
			BufferedReader in = new BufferedReader(new FileReader(file));
			String s = new String();
			while ((s = in.readLine()) != null) {
				URL url = new URL(s);
				s = null;
				URLClassLoader myClassLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread()
						.getContextClassLoader());
				Class<? extends AbstractAction> myClass = (Class<? extends AbstractAction>) myClassLoader.loadClass("com.java.jarloader.TestAction");
				AbstractAction action = (AbstractAction) myClass.newInstance();
				String str = action.action();
				System.out.println(str);
				//第二种
				URL url1 = new URL("file:D:/jarload/test.jar");
				URLClassLoader myClassLoader1 = new URLClassLoader(new URL[] { url1 }, Thread.currentThread()
						.getContextClassLoader());
				Class<?> myClass1 = myClassLoader1.loadClass("com.java.jarloader.TestAction");
				AbstractAction action1 = (AbstractAction) myClass1.newInstance();
				String str1 = action1.action();
				System.out.println(str1);
		} catch (Exception e) {
			e.printStackTrace();


第五:运行结果:

这是能完成运行的!

下面我们来改写下:

第一:将抽象类改成接口的形式  InterfaceAction 

package com.java.loader;
public interface InterfaceAction {
	public String action();

第二:改写下实体类,实现接口 TestAction

package com.java.jarloader;
import com.java.loader.InterfaceAction;
public class TestAction implements InterfaceAction{
	@Override
	public String action() {
		System.out.println("I am working ! ");
		return "this ActionTest class";


第三步相同。

第四步:稍作修改 TestMain

package com.java.main;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.net.URL;
import java.net.URLClassLoader;
import javax.swing.AbstractAction;
import com.java.loader.InterfaceAction;
			//第一种  配置成文件格式
			File file = new File("D:\\jarload\\test.txt");
			BufferedReader in = new BufferedReader(new FileReader(file));
			String s = new String();
			while ((s = in.readLine()) != null) {
				URL url = new URL(s);
				s = null;
				URLClassLoader myClassLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread()
						.getContextClassLoader());
				Class<?> myClass = (Class<?>) myClassLoader.loadClass("com.java.jarloader.TestAction");
				InterfaceAction action = (InterfaceAction) myClass.newInstance();
				String str = action.action();
				System.out.println(str);
				//第二种
				URL url1 = new URL("file:D:/jarload/test.jar");
				URLClassLoader myClassLoader1 = new URLClassLoader(new URL[] { url1 }, Thread.currentThread()
						.getContextClassLoader());
				Class<?> myClass1 = myClassLoader1.loadClass("com.java.jarloader.TestAction");
				InterfaceAction action1 = (InterfaceAction) myClass1.newInstance();
				String str1 = action1.action();
				System.out.println(str1);
		} catch (Exception e) {
			e.printStackTrace();


第五:运行结果相同。

springboot动态加载jar中的bean,在有些业务场景下,需要SpringBoot来动态加载jar中的class文件,自动往spring容器中添加新的bean;如物联网设备上传的信息用物模型来解析,用java来解析物模型,但用户的设备千差万别,解析设备的物模型不可能包罗万象,设备往物联网平台上传的数据格式也是千差万别,这时就可以让用户自已实现解析物模型的java代码,然后打成jar包,上传到物联网平台,物联网平台就可以解析当前用的设备信息了。 动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行。 下面通过一个实例来直观演示: 第一:定义一个抽象 AbstractAction (稍后换成接口的实例) public static void loadJar(String jarPath) { File jarFile = new File(jarPath); // 从URLClassLoader中获取所在文件夹的方法jar也可以认为是一个文件夹 Method method = null; try { method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); 1、动态加载jar包主要是通过URLClassLoader来加载jar包。2、然后通过ClassLoader中的loadClass来获取class。3、备注一些常用的方法。 经常碰到需要动态加载jar及class文件的场景。Java由于需要加载和编译字节码,动态加载class文件较为麻烦,但JDK仍提供了一整套方法动态加载jar文件和class文件。一、动态加载jar// 系统库路径File libPath = new File(jar文件所在路径);// 获取所有的.jar和.zip文件File[] jarFiles = libPath.listFiles(n... 在项目开发的过程中,有时候需要动态灵活的加载某个jar包并执行其里面的方法的时候,我们可以使用本篇文章写的方式去动态加载jar包而不用使用原始方式引入jar包作为lib去使用,接下来介绍如何动态加载jar包。直接上代码: 核心的方法就是下面这个loadJar方法,我们传入一个jar包的路径即可。 public static void loadJar(String jarPath) { 服务中有众多任务,当其中任一任务有改动需要升级或新增一个任务时,都需要将服务重启,会影响其他任务的正常运行。因此采用java动态加载的方式,将不同任务插件化形式加载到服务中心,配合xxl-job任务调度框架统一管理。实现了插件化任务管理。 本classloader可以从ftp或本地系统中动态加载jar,zip资源,当资源实时变动时classlader会自动重新加载,不需要应用重新启动。样例: 加载ftp上某个目录下的所有jar,zip资源。 SingleClassLoader loader = new SingleClassLoader("10.11.20.104","weblogic","weblogic","test") 加载本地目录下的所有jar,zip资源 SingleClassLoader loader = new SingleClassLoader("C:\\test\\out\\production\\test"); 每个jar由单独的SingelClassLoader加载的 很多同学想进大厂,特别是刚毕业的,以及工作年限短的,不要有任何侥幸心理,踏踏实实的把基础弄扎实了,这是你通往高薪之路的唯一正确姿势。 首先从面试题做起~好了,不多说了,直接上正菜。 Java基础 JDK 和 JRE 有什么区别? == 和 equals 的区别是什么? 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? final 在 java 中有什么作用? java 中的 Math.round(-1.5) 等于多少? String 属于基础的数据型吗? 导读:在实际项目开发中,有时会遇到需动态加载jar包的应用场景。如将Flink的UDF自定义方法制作成方法库(既打成一个Jar),在提交给Flink集群的Job中动态加载jar便可使用。下面将举一个简单实现Java动态加载Jar的例子。环境准备动态加载Jar实现解析与拓展环境准备为了便于实现Demo,这里构建一个模块化Maven项目dynamicloading,项目包含:dyna-loading-...