<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 李 明 閱讀(13703) 評論(1)  編輯  收藏 所屬分類: Java

    評論

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

    主站蜘蛛池模板: av午夜福利一片免费看久久| 亚洲va在线va天堂va888www| 亚洲色精品三区二区一区| 国产精彩免费视频| 中文字幕亚洲精品| 久久久久久精品免费看SSS| 午夜亚洲国产理论秋霞| 无码少妇精品一区二区免费动态| 久久精品国产亚洲| 一级毛片免费播放| 亚洲国产情侣一区二区三区| 无码日韩人妻av一区免费 | 亚洲综合精品香蕉久久网| 美女羞羞喷液视频免费| 免费一区二区三区四区五区| 粉色视频在线观看www免费| 亚洲AV无码乱码在线观看| 国产免费久久精品丫丫| 久久久久亚洲精品美女| 最好看最新的中文字幕免费| 久久亚洲国产成人影院| 免费国产a国产片高清| 国产精品极品美女自在线观看免费| 亚洲精品无码久久久影院相关影片| 日韩免费视频一区二区| 国产成人精品日本亚洲18图| 国产精品极品美女自在线观看免费| 久久亚洲AV无码西西人体| 男人j进入女人j内部免费网站| 亚洲图片校园春色| 国产成人啪精品视频免费网| 两个人日本免费完整版在线观看1| 亚洲国产一区二区a毛片| 成人毛片免费在线观看| 国产免费久久精品99久久| 亚洲国产日产无码精品| 亚洲国产天堂久久久久久| jjizz全部免费看片| 日本黄页网址在线看免费不卡 | 丁香花免费高清视频完整版| 亚洲aⅴ天堂av天堂无码麻豆 |