Java在不同环境下获取当前路径的方法

[资料来源:http://www.pennysoft.net]
[作者:何庆华 Penny Hot]


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.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) {
  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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值