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包。

  • 相关阅读:
    进程池,线程池,协程,gevent模块,协程实现单线程服务端与多线程客户端通信,IO模型
    线程相关 GIL queue event 死锁与递归锁 信号量l
    生产者消费者模型 线程相关
    进程的开启方式 进程的join方法 进程间的内存隔离 其他相关方法 守护进程 互斥锁
    udp协议 及相关 利用tcp上传文件 socketserver服务
    socket套接字 tcp协议下的粘包处理
    常用模块的完善 random shutil shevle 三流 logging
    day 29 元类
    Django入门
    MySQL多表查询
  • 原文地址:https://www.cnblogs.com/dartagnan/p/2003507.html
Copyright © 2011-2022 走看看