读取类所在目录路径

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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章