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定義結束