Java在不同環境下獲取當前路徑的方法

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

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章