在项目中实现了一个工具(独立运行的Java工程,打成jar包后 通过 java -jar **.jar 执行的。),该工具通过配置能够实现一些业务功能,
并且该工具提供了接口与抽象类,供其他人扩展它的功能。

这就涉及到一个问题:别人在扩展它的时候,需要引入一些jar或者配置文件,本来工具依赖的jar和配置文件都记录在manifest文件中了,
不可能别人加了jar包和配置文件就要修改manifest文件的。
所以我为工具提供了另外一个入口,通过 该通过的配置文件 进行配置 路径,由于考虑到扩展的人可能多人或者多组,所以配置文件如下定义:
以ext_classpath开头的,诸如 ext_classpath_biz1等对应的路径均被加入到classpath中。
以ext_resourcepath开头的,诸如 ext_resourcepath_biz1等对应的路径均被加入classpath中。

代码实现如下:

package  com.bz.utils;

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大仙儿相关推荐

  1. 计算机毕业设计JAVA派大星水产商城mp4mybatis+源码+调试部署+系统+数据库+lw

    计算机毕业设计JAVA派大星水产商城mp4mybatis+源码+调试部署+系统+数据库+lw 计算机毕业设计JAVA派大星水产商城mp4mybatis+源码+调试部署+系统+数据库+lw 本源码技术栈 ...

  2. java毕业生设计贝儿米幼儿教育管理系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计贝儿米幼儿教育管理系统计算机源码+系统+mysql+调试部署+lw java毕业生设计贝儿米幼儿教育管理系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B ...

  3. 请碟仙儿│一个区块链思想实验

    (图片出自网络,版权归原作者所有) 上段时间听万维钢老师说起"请碟仙儿"的原理.今天想借此发挥,不谈技术,单说区块链设计架构的思想实验. 不知道有多少朋友以前玩儿过"请碟 ...

  4. 大仙教学 Spring Security

    大仙花式讲解Spring Security 1. SpringSecurity 框架简介 1.1 概要 Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 ...

  5. java 读取txt,java读取大文件

    java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File; import java.io.RandomAccessFile; ...

  6. 零基础小白学Java难度大不大

    零基础小白学Java难度大不大?有很多人都是非常关心这个问题的,如今java在IT互联网行业的快速发展,引起了很多人的注意,那么,哪些人适合入行Java?零基础学习Java难度大吗?下面,小编就为大家 ...

  7. 送100本书!涵盖Java 、大数据、推荐系统、机器学习、黑客、数据库、手游、少儿编程等!免费包邮!...

    「清华大学出版社」联系了包括架构师小秘圈在内的 10 家技术公众号,送出 100本技术书.内容涉及Java. 大数据.推荐系统.机器学习.黑客.数据库.手游.少儿编程等! 01 书怎么送 在下面的公众 ...

  8. Java查询大文本文件的处理方法

    有时我们需要查询大文本而不是数据库,这时就需要流式读入文件并实现查询算法,还要进行并行处理以提高性能.但JAVA本身缺少相应的类库,需要硬编码才能实现结构化文件计算,代码复杂且可读性差,难以实现高效的 ...

  9. python大数据和java大数据的区别-未来Java、大数据、Python哪个前景更好,薪资更高?...

    都知道现在最火爆的是人工智能.大数据.而人工智能和大数据主要用的语言就是Java和Python.今天我们就来分析一下,当前java,python和大数据,哪个就业前景更好?自己该学哪一个? Java和 ...

最新文章

  1. 苹果Think Different广告
  2. java mybatis enum_mybatis处理枚举类的简单方法
  3. Python学习之==json处理
  4. 分享超酷的添加图片悬浮特效jQuery插件 - Adipoli
  5. ajxa异步请求数据
  6. [css] 说下background-color:transparent和opacity:0的区别是什么?
  7. mongodb 良贴
  8. 为什么我们更宠爱“随机”梯度下降?(SGD)
  9. vlc插件怎么用 wpf_使用Vlc.DotNet在我的WPF项目中添加vlc的问题。
  10. Nginx+PHP+MySQL+Ubuntu14.04 64位环境搭建
  11. jQuery正则表达式实现表单验证功能(注册)
  12. 如何用两个栈实现一个队列?
  13. 信息论相对熵的凸性证明
  14. Python为什么取名为Python,很少人知道
  15. Gangs(附C语言实现)
  16. Day29 - Countdown Timer
  17. Linux内核中的IPSEC实现2
  18. 杭州计算机职称考试培训,杭州全国职称英语等级考试强化培训班(综合类)
  19. 计算机组成的五大部分
  20. Python使用高德地图绘制经纬度坐标位置

热门文章

  1. 百度坐标批量转换成WGS84坐标
  2. C#(Csharp)基础教程(上)(菜鸟教程笔记)
  3. 电脑软件兼容性测试,兼容性测试:安全软件_软件资讯软件评测-中关村在线
  4. redis:客户端管理
  5. 【Mysql进阶-3】大量实例悟透EXPLAIN与慢查询
  6. VMware教程(二):CentOS 7 网络配置
  7. mac 命令行安装软件
  8. DOS命令:assoc
  9. 苹果最新消息_最新消息称苹果延期举行发布会:iPhone 12或将于10月推出
  10. zcmu-1919: kirito(多重背包——二进制优化)