java开发插件

最近想要用java开发一个插件。

参考

IntellijIdea 非Maven项目打Jar包(散包,依赖在外面)
IDEA导入jar包

前提

插件使用idea开发,插件项目选择java项目,导出为jar包作为插件使用。使用处采用URLClassLoader加载器加载,反射调用。

操作指南

  • 导入依赖的过程如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 导jar设置过程如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 导出操作
    在这里插入图片描述
    在这里插入图片描述

一个简单的插件

  • 调用处
@Test
public void test13() throws Exception {
    File file = new File("E:\\javaWorkSpace\\simple-plugin\\out\\artifacts\\simple_plugin_jar\\simple-plugin.jar");
    URL url = file.toURI().toURL();
    URLClassLoader classLoader = new URLClassLoader(new URL[] {url});
    Class<?> gClass = classLoader.loadClass("com.simple.plugin.SimplePlugin");
    gClass.getMethod("service").invoke(gClass.newInstance());
}
  • 插件
package com.simple.plugin;

/**
 * @description:
 * @author: zhangmy
 * @Version: 1.0
 * @create: 2021-03-26 17:26
 **/
public class SimplePlugin {
    
    public SimplePlugin() {
        System.out.println("SimplePlugin构造函数执行完毕!");
    }

    public void service() {
        System.out.println("SimplePlugin插件提供服务!");
    }
    
}
  • 结果

在这里插入图片描述

开发插件时调用第三方jar

什么是第三方jar?除了jdk以外的依赖。如果不是第三方jar,可以直接import使用,比如import java.io.File等java官方提供的。

第三方jar

package com.hwp.plugin;

/**
 * @description:
 * @author: zhangmy
 * @Version: 1.0
 * @create: 2021-03-26 16:47
 **/
public class HwpPlugin {

    public HwpPlugin() {
        System.out.println("HwpPlugin构造函数执行完毕!");
    }

    public void service() {
        System.out.println("HwpPlugin提供了服务service!");
    }
}

插件中采用ClassLoader加载第三方jar

  • 依赖:
    可以看到,没有要使用的HwpPlugin
    在这里插入图片描述

  • 插件代码:

package com.zmy.plugin;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

/**
 * @description:
 * @author: zhangmy
 * @Version: 1.0
 * @create: 2021-03-26 16:52
 **/
public class ZmyPlugin {

    public ZmyPlugin() {
        System.out.println("ZmyPlugin构造函数执行完毕!");
    }

    private static Class hwpPlugin = null;

    static {
    	//加载第三方jar,绝对路径,需要保证第三方jar的位置
        File file = new File("E:\\javaWorkSpace\\hwp-plugin\\out\\artifacts\\hwp_plugin_jar\\hwp-plugin.jar");
        try {
            URLClassLoader loader = new URLClassLoader(new URL[] {file.toURI().toURL()});
            hwpPlugin = loader.loadClass("com.hwp.plugin.HwpPlugin");
            System.out.println("static代码块中加载HwpPlugin.class完毕!");
        } catch (MalformedURLException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public void service () throws Exception {
        System.out.println("zmy-plugin先调用hwp-plugin的功能!");
        hwpPlugin.getMethod("service").invoke(hwpPlugin.newInstance());
        System.out.println("zmy-plugin调用hwp-plugin的功能完毕了!");
        System.out.println("ZmyPlugin提供了自己的功能!");
    }

}
  • 打包的插件jar结构
    在这里插入图片描述

  • 结果:

在这里插入图片描述

  • 问题:

1、如果需要使用很多三方工具,需要加载很多类,每个类都要使用反射来调用,很麻烦。
2、使用的第三方jar的位置被限制了。

插件中采用添加依赖+import的方式使用第三方jar

  • 依赖:
    HwpPlugin被导入
    在这里插入图片描述

  • 插件代码:

package com.dpw.plugin;

import com.hwp.plugin.HwpPlugin;

/**
 * @description:
 * @author: zhangmy
 * @Version: 1.0
 * @create: 2021-03-26 17:07
 **/
public class DpwPlugin {

    public DpwPlugin() {
        System.out.println("DpwPlugin构造函数执行完毕!");
    }

    public void service() {
        System.out.println("DpwPlugin调用HwpPlugin提供的功能!");
        HwpPlugin hwpPlugin = new HwpPlugin();
        hwpPlugin.service();
        System.out.println("HwpPlugin提供功能完毕!");
        System.out.println("DpwPlugin提供了自己的功能!");
    }

}

  • 打包的插件jar结构

在这里插入图片描述

  • 结果:

在这里插入图片描述

  • 思考:

import是从当前jar的根开始,按照路径去寻找指定的类型的.class文件

  • 好处:

不需要反射调用,开发简单

  • 问题:

打出的jar包包含所有依赖,会比较大。

注意:

导出jar的设置需要选择extract to the target jar选项,不推荐另外一个。选择另外一个包结构会有所有变化,不好管理。

在这里插入图片描述

在这里插入图片描述


探索了三天,特此记录。

可以使用maven管理依赖,打包方式采用上面所述,更佳。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值