java cloassLoader大仙儿
在项目中实现了一个工具(独立运行的Java工程,打成jar包后 通过 java -jar **.jar 执行的。),该工具通过配置能够实现一些业务功能,
并且该工具提供了接口与抽象类,供其他人扩展它的功能。
这就涉及到一个问题:别人在扩展它的时候,需要引入一些jar或者配置文件,本来工具依赖的jar和配置文件都记录在manifest文件中了,
不可能别人加了jar包和配置文件就要修改manifest文件的。
所以我为工具提供了另外一个入口,通过 该通过的配置文件 进行配置 路径,由于考虑到扩展的人可能多人或者多组,所以配置文件如下定义:
以ext_classpath开头的,诸如 ext_classpath_biz1等对应的路径均被加入到classpath中。
以ext_resourcepath开头的,诸如 ext_resourcepath_biz1等对应的路径均被加入classpath中。
代码实现如下:
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.List;
/**
* 根据properties中配置的路径把jar和配置文件加载到classpath中。
* @author jnbzwm
*
*/
public final class ExtClasspathLoader {
/** URLClassLoader的addURL方法 */
private static Method addURL = initAddMethod();
private static URLClassLoader classloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
/**
* 初始化addUrl 方法.
* @return 可访问addUrl方法的Method对象
*/
private static Method initAddMethod() {
try {
Method add = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class });
add.setAccessible(true);
return add;
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 加载jar classpath。
*/
public static void loadClasspath() {
List<String> files = getJarFiles();
for (String f : files) {
loadClasspath(f);
}
List<String> resFiles = getResFiles();
for (String r : resFiles) {
loadResourceDir(r);
}
}
private static void loadClasspath(String filepath) {
File file = new File(filepath);
loopFiles(file);
}
private static void loadResourceDir(String filepath) {
File file = new File(filepath);
loopDirs(file);
}
/**
* 循环遍历目录,找出所有的资源路径。
* @param file 当前遍历文件
*/
private static void loopDirs(File file) {
// 资源文件只加载路径
if (file.isDirectory()) {
addURL(file);
File[] tmps = file.listFiles();
for (File tmp : tmps) {
loopDirs(tmp);
}
}
}
/**
* 循环遍历目录,找出所有的jar包。
* @param file 当前遍历文件
*/
private static void loopFiles(File file) {
if (file.isDirectory()) {
File[] tmps = file.listFiles();
for (File tmp : tmps) {
loopFiles(tmp);
}
}
else {
if (file.getAbsolutePath().endsWith(".jar") || file.getAbsolutePath().endsWith(".zip")) {
addURL(file);
}
}
}
/**
* 通过filepath加载文件到classpath。
* @param filePath 文件路径
* @return URL
* @throws Exception 异常
*/
private static void addURL(File file) {
try {
addURL.invoke(classloader, new Object[] { file.toURI().toURL() });
}
catch (Exception e) {
}
}
/**
* 从配置文件中得到配置的需要加载到classpath里的路径集合。
* @return
*/
private static List<String> getJarFiles() {
// TODO 从properties文件中读取配置信息略
return null;
}
/**
* 从配置文件中得到配置的需要加载classpath里的资源路径集合
* @return
*/
private static List<String> getResFiles() {
//TODO 从properties文件中读取配置信息略
return null;
}
public static void main(String[] args) {
ExtClasspathLoader.loadClasspath();
}
}
java cloassLoader大仙儿相关推荐
- 计算机毕业设计JAVA派大星水产商城mp4mybatis+源码+调试部署+系统+数据库+lw
计算机毕业设计JAVA派大星水产商城mp4mybatis+源码+调试部署+系统+数据库+lw 计算机毕业设计JAVA派大星水产商城mp4mybatis+源码+调试部署+系统+数据库+lw 本源码技术栈 ...
- java毕业生设计贝儿米幼儿教育管理系统计算机源码+系统+mysql+调试部署+lw
java毕业生设计贝儿米幼儿教育管理系统计算机源码+系统+mysql+调试部署+lw java毕业生设计贝儿米幼儿教育管理系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B ...
- 请碟仙儿│一个区块链思想实验
(图片出自网络,版权归原作者所有) 上段时间听万维钢老师说起"请碟仙儿"的原理.今天想借此发挥,不谈技术,单说区块链设计架构的思想实验. 不知道有多少朋友以前玩儿过"请碟 ...
- 大仙教学 Spring Security
大仙花式讲解Spring Security 1. SpringSecurity 框架简介 1.1 概要 Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 ...
- java 读取txt,java读取大文件
java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File; import java.io.RandomAccessFile; ...
- 零基础小白学Java难度大不大
零基础小白学Java难度大不大?有很多人都是非常关心这个问题的,如今java在IT互联网行业的快速发展,引起了很多人的注意,那么,哪些人适合入行Java?零基础学习Java难度大吗?下面,小编就为大家 ...
- 送100本书!涵盖Java 、大数据、推荐系统、机器学习、黑客、数据库、手游、少儿编程等!免费包邮!...
「清华大学出版社」联系了包括架构师小秘圈在内的 10 家技术公众号,送出 100本技术书.内容涉及Java. 大数据.推荐系统.机器学习.黑客.数据库.手游.少儿编程等! 01 书怎么送 在下面的公众 ...
- Java查询大文本文件的处理方法
有时我们需要查询大文本而不是数据库,这时就需要流式读入文件并实现查询算法,还要进行并行处理以提高性能.但JAVA本身缺少相应的类库,需要硬编码才能实现结构化文件计算,代码复杂且可读性差,难以实现高效的 ...
- python大数据和java大数据的区别-未来Java、大数据、Python哪个前景更好,薪资更高?...
都知道现在最火爆的是人工智能.大数据.而人工智能和大数据主要用的语言就是Java和Python.今天我们就来分析一下,当前java,python和大数据,哪个就业前景更好?自己该学哪一个? Java和 ...
最新文章
- 苹果Think Different广告
- java mybatis enum_mybatis处理枚举类的简单方法
- Python学习之==json处理
- 分享超酷的添加图片悬浮特效jQuery插件 - Adipoli
- ajxa异步请求数据
- [css] 说下background-color:transparent和opacity:0的区别是什么?
- mongodb 良贴
- 为什么我们更宠爱“随机”梯度下降?(SGD)
- vlc插件怎么用 wpf_使用Vlc.DotNet在我的WPF项目中添加vlc的问题。
- Nginx+PHP+MySQL+Ubuntu14.04 64位环境搭建
- jQuery正则表达式实现表单验证功能(注册)
- 如何用两个栈实现一个队列?
- 信息论相对熵的凸性证明
- Python为什么取名为Python,很少人知道
- Gangs(附C语言实现)
- Day29 - Countdown Timer
- Linux内核中的IPSEC实现2
- 杭州计算机职称考试培训,杭州全国职称英语等级考试强化培训班(综合类)
- 计算机组成的五大部分
- Python使用高德地图绘制经纬度坐标位置
热门文章
- 百度坐标批量转换成WGS84坐标
- C#(Csharp)基础教程(上)(菜鸟教程笔记)
- 电脑软件兼容性测试,兼容性测试:安全软件_软件资讯软件评测-中关村在线
- redis:客户端管理
- 【Mysql进阶-3】大量实例悟透EXPLAIN与慢查询
- VMware教程(二):CentOS 7 网络配置
- mac 命令行安装软件
- DOS命令:assoc
- 苹果最新消息_最新消息称苹果延期举行发布会:iPhone 12或将于10月推出
- zcmu-1919: kirito(多重背包——二进制优化)