讀取類所在目錄路徑

Service:

/**
 * -----------------------------------------------------------------------
 *getAppPath需要一個當前程序使用的Java類的class屬性參數,它可以返回打包過的
 *Java可執行文件(jar,war)所處的系統目錄名或非打包Java程序所處的目錄
 *@paramcls爲Class類型
 *@return返回值爲該類所在的Java程序運行的目錄
 * -------------------------------------------------------------------------
 */
public static String getAppPath(Class cls) {
    //檢查用戶傳入的參數是否爲空
    if (cls == null) throw new java.lang.IllegalArgumentException("參數不能爲空!");
    ClassLoader loader = cls.getClassLoader();
    //獲得類的全名,包括包名
    String clsName = cls.getName() + ".class";
    //獲得傳入參數所在的包
    Package pack = cls.getPackage();
    String path = "";
    //如果不是匿名包,將包名轉化爲路徑
    if (pack != null) {
        String packName = pack.getName();
        //此處簡單判定是否是Java基礎類庫,防止用戶傳入JDK內置的類庫
        if (packName.startsWith("java.") || packName.startsWith("javax."))
            throw new java.lang.IllegalArgumentException("不要傳送系統類!");
        //在類的名稱中,去掉包名的部分,獲得類的文件名
        clsName = clsName.substring(packName.length() + 1);
        //判定包名是否是簡單包名,如果是,則直接將包名轉換爲路徑,
        if (packName.indexOf(".") < 0)
            path = packName + "/";
        else {
            //否則按照包名的組成部分,將包名轉換爲路徑
            int start = 0, end = 0;
            end = packName.indexOf(".");
            while (end != -1) {
                path = path + packName.substring(start, end) + "/";
                start = end + 1;
                end = packName.indexOf(".", start);
            }
            path = path + packName.substring(start) + "/";
        }
    }
    //調用ClassLoader的getResource方法,傳入包含路徑信息的類文件名
    java.net.URL url = loader.getResource(path + clsName);
    //從URL對象中獲取路徑信息
    String realPath = url.getPath();
    //去掉路徑信息中的協議名"file:"
    int pos = realPath.indexOf("file:");
    if (pos > -1)
        realPath = realPath.substring(pos + 5);
    //去掉路徑信息最後包含類文件信息的部分,得到類所在的路徑
    pos = realPath.indexOf(path + clsName);
    realPath = realPath.substring(1, pos - 1);
    //如果類文件被打包到JAR等文件中時,去掉對應的JAR等打包文件名
    if (realPath.endsWith("!"))
        realPath = realPath.substring(0, realPath.lastIndexOf("/"));
    try {
        realPath = java.net.URLDecoder.decode(realPath, "utf-8");
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    System.out.println(realPath);
    return realPath;
}//getAppPath定義結束

傳入一個類,測試結果:D:/workspace/bcr/server/target/classes

/**
 * 查詢jar包運行路徑
 *
 * @return
 */
public static String getJarUrl() {
    URL url = JarUrlUtil.class.getProtectionDomain().getCodeSource().getLocation();
    String filePath = "";
    try {
        filePath = URLDecoder.decode(url.getPath(), "utf-8");// 轉化爲utf-8編碼,支持中文
    } catch (Exception e) {
        logger.error(e.getMessage(), e);
    }

    int i = filePath.indexOf(".jar");
    if (i >= 0) {// 可執行jar包運行的結果裏包含".jar"
        // 獲取jar包所在目錄
        filePath = filePath.substring(0, filePath.lastIndexOf("/", i) + 1);
    }

    File file = new File(filePath);
    filePath = file.getAbsolutePath();

    i = filePath.indexOf("file:");
    if (i >= 0) {
        filePath = filePath.substring(0, filePath.lastIndexOf(File.separator, i));
    }
    String classesUrl = File.separator + "classes";
    i = filePath.indexOf(classesUrl);
    if (i >= 0) {
        filePath = filePath.substring(0, i);
    }
    return filePath;
}//getJarUrl定義結束


發佈了106 篇原創文章 · 獲贊 255 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章