zoukankan      html  css  js  c++  java
  • java中获取路径的几种方法

    //当前的classpath   

    System.out.println(Thread.currentThread().getContextClassLoader().getResource("./").getPath()); 
    //Test.class文件所在路径 即包路径
    System.out.println(Test.class.getResource(""));

    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


    另附:

     

    打包成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

     

    如果打包后的jar程序要运行,它必须包含一个清单文件manifest.mf,这个文件用记事本就可以打开,
    这个文件里面有这么一个属性Main-Class:。
    这个属性记录了这个jar包中拥有main方法的那个类,虚拟机就是先通过这个文件获得拥有main方法的类,然后首先加载这个类,
    你的程序不能运行可能是缺少主类,一般一个程序可能包括几个jar包,而在这几个jar包中有且只有一个主类,主类在运行时调用其它jar包。

  • 相关阅读:
    关于CSDN指针讨论的心得
    VC++ 6.0 与VS2008 C++ DEBUG工具(Windows)介绍
    VC++ 申明静态变量的注意事项
    大家好,我是新的blue1000~
    [讨论]当我采用动态sql绑定datagrid分页的时候,遇到的问题
    我与Google有个对话
    [BK专访]一切以客户为中心,其它一切纷至沓来
    [译]在.net中使用GDI+来提高gif图片的保存画质
    微软能不能别这样坑爹啊,即使不中毒,也伤不起啊
    长见识!1021字节javascript写成的3D圣诞树
  • 原文地址:https://www.cnblogs.com/dartagnan/p/2003507.html
Copyright © 2011-2022 走看看