<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无码专区亚洲av桃花岛| 亚洲日韩亚洲另类激情文学| 国产啪精品视频网免费| 亚洲综合激情视频| 日韩欧毛片免费视频 | 久久久久亚洲AV成人网| 免费观看四虎精品成人| 亚洲中文无韩国r级电影| 九一在线完整视频免费观看| 国产L精品国产亚洲区久久| 国产精品免费观看视频| 亚洲色偷偷偷鲁综合| 日韩电影免费观看| 亚洲综合综合在线| 精品国产一区二区三区免费看| 国产综合激情在线亚洲第一页| 国产av无码专区亚洲国产精品| 免费国产叼嘿视频大全网站| 亚洲黄网在线观看| 在线精品免费视频| 大片免费观看92在线视频线视频 | 黑人粗长大战亚洲女2021国产精品成人免费视频| 大地资源二在线观看免费高清| 亚洲依依成人亚洲社区| 亚洲精品成a人在线观看| 久久久久免费精品国产| 亚洲人成影院77777| 亚洲国产激情一区二区三区| av永久免费网站在线观看 | 在线观看亚洲人成网站| 毛片免费在线视频| 国产免费人成视频在线播放播| 久久久青草青青亚洲国产免观 | 亚洲精品tv久久久久久久久久| 久久99免费视频| 亚洲入口无毒网址你懂的| 亚洲国产电影av在线网址| 69视频免费在线观看| 亚洲A∨精品一区二区三区下载 | 久久久久亚洲AV成人网人人网站 |