參考原文:
-
CSDN| Java擷取類路徑的方式:
https://blog.csdn.net/An1090239782/article/details/82590011
- Java如何擷取目前的jar包路徑以及如何讀取jar包中的資源:https://www.cnblogs.com/zeciiii/p/4178824.html
擷取項目路徑、類加載路徑、目前類路徑,和在jar包中運作的結果對比
public void printPath() throws IOException {
/*
* 擷取項目路徑
*/
System.out.println("**擷取項目路徑**");
System.out.print("\t1.利用File類提供的方法 擷取項目路徑-----\n\t");
//1. (利用File類提供的方法 擷取項目路徑)
File directory = new File("");// 參數為空
String courseFile = directory.getCanonicalPath();
System.out.println(courseFile);
System.out.print("\t2.System.getProperty()函數擷取項目路徑-----\n\t");
//2. (System.getProperty()函數擷取項目路徑)
String property = System.getProperty("user.dir");
System.out.println(property);
/*
* 擷取類加載根路徑(classes目錄)
*/
System.out.println("**擷取類加載根路徑classes**");
System.out.print("\t3.使用getClass().getResource(\"/\")方法-----\n\t");
//3. (使用getClass().getResource("/")方法)
URL path_1 = this.getClass().getResource("/");//傳回URL的對象,路徑前方以file:開頭,并且以"/"做目錄間隔
System.out.println(path_1);// file:/D:/work/workspace_set/workspace_javaee/ProjectJavaWay/target/classes/
System.out.print("\t");
String path_2 = this.getClass().getResource("/").getPath();//傳回路徑最前方和末尾均多一個"/",并且以"/"做目錄間隔
System.out.println(path_2);// /D:/work/workspace_set/workspace_javaee/ProjectJavaWay/target/classes/
System.out.print("\t");
String path_3 = this.getClass().getResource("/").getFile();//.getFile()和.getPath()作用相同
System.out.println(path_3);// /D:/work/workspace_set/workspace_javaee/ProjectJavaWay/target/classes/
System.out.print("\t");
File file = new File(path_2);//用File對象處理後,會删除頭尾的"/",并且将所有的以"\(反斜杠)"間隔目錄
System.out.println(file);// D:\work\workspace_set\workspace_javaee\ProjectJavaWay\target\classes
System.out.print("\t4.使用getClass().getClassLoader()方法-----\n\t");
//4. (使用getClass().getClassLoader()方法)
String classsesPath_1 = this.getClass().getClassLoader().getResource("").getPath();
System.out.println(classsesPath_1);
System.out.print("\t5.使用getClass().getProtectionDomain().getCodeSource()方法-----\n\t");
//5. (使用getClass().getProtectionDomain().getCodeSource()方法)
String classsesPath_2 = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
System.out.println(classsesPath_2);
/*
* 擷取目前類所在目錄
*/
System.out.println("**6.擷取目前類所在目錄**");
String classPath = this.getClass().getResource("").getPath();
System.out.println(classPath);
// 第五種: 擷取所有的類路徑 包括jar包的路徑(...\classes和...\**.jar)
System.out.println("**7.擷取所有的類路徑 包括jar包的路徑(...\\classes和...\\**.jar)**");
System.out.println(System.getProperty("java.class.path"));
}
eclipse中執行獲得輸出内容如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNCM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csETOHFmaWNjWw50MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwUTN1MTMzYTMzIDOwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
将這個類打成jar包,運作結果如下:
發現出現問題,在jar包中時,
URL path_1 = this.getClass().getResource("/");
this.getClass().getClassLoader().getResource("");
,這兩種方式擷取到的值為null,是以導緻後續出現空指針異常。
經過測試,發現隻有1、2、5、7方式能夠使用: