flink sql udf jar包_Java动态加载Jar实例解析
导读:在实际项目开发中,有时会遇到需动态加载jar包的应用场景。如将Flink的UDF自定义方法制作成方法库(既打成一个Jar),在提交给Flink集群的Job中动态加载jar便可使用。下面将举一个简单实现Java动态加载Jar的例子。
- 环境准备
- 动态加载Jar实现
- 解析与拓展
环境准备
为了便于实现Demo,这里构建一个模块化Maven项目dynamicloading,项目包含:dyna-loading-function方法库模块、dyna-loading-core核心模块。
在dyna-loading-function中编写方法
编写一个方法抽象类,及一个实现类Split,class
/** * 方法抽象类 */public abstract class AbstractFunction { public abstract void eval(String s);}/*** 字符串截取方法*/public class Split extends AbstractFunction { @Override public void eval(String s) { System.out.println("对字符串"+s+"进行截取操作"); }}
将dyna-loading-function打成Jar包
在dyna-loading-core模块实现动态加载Jar
import java.io.File;import java.lang.reflect.Method;import java.net.URL;import java.net.URLClassLoader;public class dynaLoadTest { public static void main(String[] args) throws Exception{ //jar所在路径 String jarPath = "C:epocomwxbdyna-loading-function1.0-SNAPSHOTdyna-loading-function-1.0-SNAPSHOT.jar"; loadJar(jarPath); //利用反射 Class> aClass = Class.forName("function.Split"); Object instance = aClass.newInstance(); //调用方法 aClass.getDeclaredMethod("eval", String.class).invoke(instance, "hello word"); } //动态加载Jar public static void loadJar(String jarPath) { File jarFile = new File(jarPath); //文件存在 if (jarFile.exists() == false) { System.out.println("jar file not found."); return; } //从URLClassLoader类加载器中获取类的addURL方法 Method method = null; try { method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); } catch (NoSuchMethodException | SecurityException e1) { e1.printStackTrace(); } // 获取方法的访问权限 boolean accessible = method.isAccessible(); try { //修改访问权限为可写 if (accessible == false) { method.setAccessible(true); } // 获取系统类加载器 URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); //获取jar文件的url路径 URL url = jarFile.toURI().toURL(); //jar路径加入到系统url路径里 method.invoke(classLoader, url); } catch (Exception e) { e.printStackTrace(); } finally { method.setAccessible(accessible); } }}
运行
解析与拓展
ClassLoader是类加载器,其具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确运行了。java程序运行的时候,类必须被加载到jvm虚拟机中才可以正常使用。但不是所有的class文件都在启动的时候全部加载,根据资料java最早就是为嵌入式系统而设计的,内存宝贵。如果开始时就把所有类都加载到jvm中,有些class可能在整个运行过程中都不会被用到,这样便会占用宝贵的内存。因此启动时会先把保证程序运行的基础类一次性加载到jvm中,其它class等到jvm用到的时候再通过动态加载将其加载到jvm虚拟中。
Java中内置了很多的类加载器,而ClassLoader是所有类加载器的基类,它是个抽象类,其定义了类加载最核心的操作。因本文主题是动态加载Jar,所以下面我们主要讨论URLClassLoader。
URLClassLoader
URLClassLoader继承自SecureClassLoader,支持从jar文件和文件夹中获取class。而SecureClassLoader继承于ClassLoader。
核心代码:
//1、通过getDeclaredMethod获取URLClassLoader的addURL,这一步的目的是为了设置addURL方法可写Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);method.setAccessible(true);//2、获取 URLClassLoader加载器 URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();//3、获取目标jar的URLURL url = jarFile.toURI().toURL();//4、执行addURL方法,通过URLclassLoader从指定jar中获取class并动态加到jvm虚拟机里 method.invoke(classLoader, url);//5、class成功被动态加载进虚拟机后,就可以利用反射获取Class> aClass = Class.forName("function.Split");
最后
感谢您的阅读,如果喜欢本文欢迎关注和转发,本头条号将坚持原创,持续分享IT技术知识。对于文章内容有其他想法或意见建议等,欢迎提出共同讨论共同进步
flink sql udf jar包_Java动态加载Jar实例解析相关推荐
- java动态打jar包_java动态加载jar包
目录结构如下. ├── main │ ├── java │ │ └── lu │ │ └── tool │ │ └── jar │ │ ├── InterfaceR ...
- flink sql udf jar包_FlinkSQL 动态加载 UDF 实现思路
导读: 最近在对 Flink 进行平台化,基于 REST API 构建一个平台实现通过纯 SQL 化编写和管理 Job.尽管 Flink官方希望用户将所有的依赖和业务逻辑打成一个fat jar,这样方 ...
- java spring包_java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式...
java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式 发布时间:2018-08-20 12:02, 浏览次数:774 , 标签: java spri ...
- android动态jar,Android动态加载Jar(包含第三方依赖Jar)
最近项目有一个需求,需要根据用户需求动态加载APP内某功能模块,且当该部分功能模块代码有变动,只需更新该功能JAR,无需更新整个APK,基于这个需求,决定采用动态加载Jar的方式去实现,于是各种查资料 ...
- java动态加载jar文件并执行方法
在项目开发的过程中,有时候需要动态灵活的加载某个jar包并执行里面的方法的时候,我们可以使用本篇文章写得方式去动态的加载jar包而不用使用原始方式引入jar包作为lib去使用,接下来介绍如何动态加载j ...
- [转]Android动态加载jar/dex
本文转自:http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html 前言 在目前的软硬件环境下,Native App与Web App ...
- Java动态加载jar及class文件
经常碰到需要动态加载jar及class文件的场景.Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,但JDK仍提供了一整套方法来动态加载jar文件和class文件. 一.动态加载ja ...
- Android将so库封装到jar包中并加载其中的so库
Android将so库封装到jar包中并加载其中的so库 之前写过将jar包和so库封装到jar包中的文章,但是没有考虑别人调用时需要加载so库的问题.因为so库放入jar之后,so就不是一个独立的. ...
- java动态加载jar时,jar中还有第三方jar无法加载的解决方法
java动态加载jar时,jar中还有第三方jar无法加载的解决方法 当java插件化开发时,即一个java程序在运行的情况下动态加载另一个jar,网上大多数的方法如下 public static v ...
最新文章
- R语言包_plotly
- SQL 语句 - Select(1): 指定表
- [你必须知道的.NET]第十四回:认识IL代码---从开始到现在
- hdu - 3415 Max Sum of Max-K-sub-sequence
- python3 rid1.7.4.2 控制台中文乱码_TL;DR - 有关 Python 2 和 Sublime Text 中文 Unicode 编码问题的分析与理解...
- Kotlin基础语法学习类和对象(一)
- oracle分布式数据库中间件,分布式数据库中间件设想
- 简单分布式系统构建知识
- 网站维护不给提,问客服就说维护结束会给通知
- 一键GHOST v2019.08.12优盘教程
- ISO镜像安装WIN10到NVME固态硬盘,无法找到新加装的NVME硬盘(驱动器)
- 如何快速上手制作高质量短视频?
- rds mysql 导出数据文件_rds数据库导出
- HTML基础知识(一) 网页简介
- 线性空间2--子空间
- 怎样将PPT文件进行压缩?这几步很简单
- Office 2010 博文征集开始 - 抢先下载 抢先得奖
- 恒定积自动做市--兑换比例,滑点,平均成本,资金进出对价格影响
- 重新排列数组[数组] 给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列。请你将数组按 [x1,y1,x2,y2,...,x
- 磊科路由器dns服务器无响应,磊科MG1200AC的DNS抽风问题
热门文章
- 一个SAP成都研究院开发工程师 2020 年的所有文章列表
- RFC remote call during status filter logic
- Fiori offline support : overrideRefreshHandling and injectRefreshList
- SAP OData etag flag setting in metadata MPC_EXT
- 在C4C UI里嵌入CRM WebClient UI
- CloudFoundry cf push命令报错误码223的解决方法
- 利用php-console和Chrome开发者工具实现PHP应用的printf
- SAP CRM configuration product在UI上的显示逻辑
- ABAP和Java的单元测试Unit Test
- Win10计算机首次使用时间,如何查看Win10开机运行了多长时间