<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ALL is Well!

    敏捷是一條很長的路,摸索著前進著

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      30 隨筆 :: 23 文章 :: 71 評論 :: 0 Trackbacks

    在項目中實現了一個工具(獨立運行的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();
        }

    }


    本文為原創,歡迎轉載,轉載請注明出處BlogJava
    posted on 2011-04-01 20:39 李 明 閱讀(13704) 評論(1)  編輯  收藏 所屬分類: Java

    評論

    # re: java代碼實現利用 classloader 動態加載 jar包、文件夾到classpath中 2011-04-01 22:37 Phirothing
    不錯,學習了。  回復  更多評論
      

    主站蜘蛛池模板: 最近的免费中文字幕视频| 四虎免费影院ww4164h| 又粗又黄又猛又爽大片免费| 亚洲乱码一二三四区麻豆| 每天更新的免费av片在线观看 | 久久久久亚洲精品美女| 中文字幕一区二区免费| 亚洲人成色77777| 你是我的城池营垒免费看 | 亚洲人成影院在线高清| 免费阿v网站在线观看g| 亚洲乱码无人区卡1卡2卡3| 日本免费一区二区三区最新 | 久9热免费精品视频在线观看| 亚洲AV日韩精品久久久久| 久久国产免费观看精品3| 亚洲国产成人va在线观看网址| 免费H网站在线观看的| 朝桐光亚洲专区在线中文字幕 | 国产亚洲成av片在线观看| 久久综合九色综合97免费下载| 亚洲国产精品综合久久2007| 欧美三级在线电影免费| 亚洲成a∨人片在无码2023 | 亚洲精品电影天堂网| 成年女人免费v片| 免费看一级毛片在线观看精品视频| 亚洲精品无码专区久久久| 1区2区3区产品乱码免费| 精品国产日韩亚洲一区91| 亚洲人成色7777在线观看| 美女视频黄免费亚洲| 日本高清不卡中文字幕免费| 色拍自拍亚洲综合图区| 免费爱爱的视频太爽了| 中文字字幕在线高清免费电影| 亚洲国产成人综合| 亚洲精品在线视频| 免费黄色福利视频| 精品国产福利尤物免费| 国产成人精品日本亚洲专区6|