1. 在Servlet/Filter等Servlet web環境中,只要獲得javax.servlet.ServletContext類型,則可以通過 getRealPath("...") 獲得路徑。相對路徑中最頂層目錄可通過參數“"/"”獲取。
request.getSession().getServletContext().getRealPath("/");
2. JSP自定義標籤javax.servlet.jsp.tagext.TagSupport
((javax.servlet.ServletContext)pageContext).getRealPath("");
3. 普通Java Class對象文件中使用:
this.getClass().getResource("???");
如果Class文件在頂層目錄(包)中,且“???”爲空白字符串(“""”),及此方法在jar文件中執行則會返回null。在頂層目錄(包)以下的各層目錄(包)則會返回包含協議的URL。各層文件夾(包)之間使用“/”分隔。
項目位置:C:/project 目錄。
文件位置:C:/project/Test.java
文件內容:
/* source begin. */
public class Test {
public Test () {
System.out.println(this.getClass().getResource(""));
System.out.println(this.getClass().getResource("."));
System.out.println(this.getClass().getResource("/"));
System.out.println(this.getClass().getResource("Test.class"));
System.out.println(this.getClass().getResource("/Test.class"));
System.out.println(this.getClass().getResource("./Test.class"));
System.out.println(this.getClass().getResource("com/Test.class"));
System.out.println(this.getClass().getResource("/com/Test.class"));
System.out.println(this.getClass().getResource("./com/Test.class"));
}
public static void main(String[] args) {
System.out.println("====== Test.class ======");
Test test = new Test();
System.out.println("====== com/Test.class ======");
com.Test com_test = new com.Test();
}
}
/* source end. */
文件位置:C:/project/com/Test.java
文件內容:
/* source begin. */
package com;
public class Test {
public Test () {
System.out.println(this.getClass().getResource(""));
System.out.println(this.ge
tClass().getResource("."));
System.out.println(this.getClass().getResource("/"));
System.out.println(this.getClass().getResource("Test.class"));
System.out.println(this.getClass().getResource("/Test.class"));
System.out.println(this.getClass().getResource("./Test.class"));
System.out.println(this.getClass().getResource("com/Test.class"));
System.out.println(this.getClass().getResource("/com/Test.class"));
System.out.println(this.getClass().getResource("./com/Test.class"));
}
public static void main(String[] args) {
Test test = new Test();
}
}
/* source end. */
編譯源代碼:
假定%jdk_bin%爲jdk/bin目錄。
%jdk_bin%/javac test.java
%jdk_bin%/javac com/test.java
編譯後在命令行窗口中運行:
假定%jdk_bin%爲jdk/bin目錄。
%jdk_bin%/java Test
顯示結果:
====== Test.class ======
file:/C:/project/
file:/C:/project/
file:/C:/project/
file:/C:/project/Test.class
file:/C:/project/Test.class
file:/C:/project/Test.class
file:/C:/project/com/Test.class
file:/C:/project/com/Test.class
file:/C:/project/com/Test.class
====== com/Test.class ======
file:/C:/project/com/
file:/C:/project/com/
file:/C:/project/
file:/C:/project/com/Test.class
file:/C:/project/Test.class
file:/C:/project/com/Test.class
null
file:/C:/project/com/Test.class
null
打包成可執行Jar後在命令行窗口中運行:
假定%jdk_bin%爲jdk/bin目錄。
%jdk_bin%/java -jar Test.jar
顯示結果:
====== Test.class ======
null
null
null
jar:file:/C:/project/test.jar!/Test.class
jar:file:/C:/project/test.jar!/Test.class
null
jar:file:/C:/project/test.jar!/com/Test.class
jar:file:/C:/project/test.jar!/com/Test.class
null
====== com/Test.class ======
jar:file:/C:/project/test.jar!/com/
null
null
jar:file:/C:/project/test.jar!/com/Test.class
jar:file:/C:/project/test.jar!/Test.class
null
null
jar:file:/C:/project/test.jar!/com/Test.class
null
[參考1]打包成windows雙擊執行的Jar方法:
1. 在 c:/project 目錄下新建 META-INF 目錄,在 c:/project/META-INF 目錄下新建 MANIFEST.MF 文件,手動生成jar文件的“標明清單(manifest)”。其中“Main-Class: Test”是聲明雙擊jar文件後自動運行的類文件,其中這個類文件一定要有main方法,效果等於運行“java -jar test.jar”命令,但不顯示DOS運行窗口。MANIFEST.MF 文件內容如下:
# source begin. #
Manifest-Version: 1.0
Sealed: true
Main-Class: Test
Class-Path:
# source end. #
2. 在命令行窗口中鍵入以下命令,其中%java_home%爲java安裝目錄,cvfM中的M一定要大寫,因爲要明確要求jar文件使用我們自己創建的MANIFEST.MF文件,如果使用小寫m,則 META-INF 目錄及 MANIFEST.MF 由jar命令生成。
假定%jdk_bin%爲jdk/bin目錄。
%jdk_bin%/jar cvfM test.jar *.*
[參考2]目錄樹:
C:/project
+- com
| +- Test.class
|
+- META-INF
| +- MANIFEST.MF
|
+- Test.class
資料來源:http://www.pennysoft.net
作者:何慶華 Penny Hot