获取Java程序运行的路径 | 获取当前jar包的路径

时间:2020-11-25 09:12:54

经过试验,不管是否是 Jar 包,不管是否是 Tomcat 部署,以下三个方法均可实现。

 

package test;

 

public class MyPath {

    public static String getProjectPath() {

 

       java.net.URL url = MyPath.class .getProtectionDomain().getCodeSource().getLocation();

       String filePath = null ;

       try {

           filePath = java.net.URLDecoder.decode (url.getPath(), "utf-8");

       } catch (Exception e) {

           e.printStackTrace();

       }

    if (filePath.endsWith(".jar"))

       filePath = filePath.substring(0, filePath.lastIndexOf("/") + 1);

    java.io.File file = new java.io.File(filePath);

    filePath = file.getAbsolutePath();

    return filePath;

}

 

    public static String getRealPath() {

       String realPath = MyPath.class .getClassLoader().getResource("").getFile();

       java.io.File file = new java.io.File(realPath);

       realPath = file.getAbsolutePath();

       try {

           realPath = java.net.URLDecoder.decode (realPath, "utf-8");

       } catch (Exception e) {

           e.printStackTrace();

       }

 

       return realPath;

    }

 

    public static String getAppPath(Class<?> cls){ 

       //检查用户传入的参数是否为空 

        if (cls==null )  

        throw new java.lang.IllegalArgumentException("参数不能为空!"); 

 

        ClassLoader loader=cls.getClassLoader(); 

        //获得类的全名,包括包名 

        String clsName=cls.getName();

        //此处简单判定是否是Java基础类库,防止用户传入JDK内置的类库 

        if (clsName.startsWith("java.")||clsName.startsWith("javax.")) {

        throw new java.lang.IllegalArgumentException("不要传送系统类!");

        }

        //将类的class文件全名改为路径形式

        String clsPath= clsName.replace(".", "/")+".class"; 

 

        //调用ClassLoader的getResource方法,传入包含路径信息的类文件名 

        java.net.URL url =loader.getResource(clsPath); 

        //从URL对象中获取路径信息 

        String realPath=url.getPath(); 

        //去掉路径信息中的协议名"file:" 

        int pos=realPath.indexOf("file:"); 

        if (pos>-1) {

        realPath=realPath.substring(pos+5); 

        }

        //去掉路径信息最后包含类文件信息的部分,得到类所在的路径 

        pos=realPath.indexOf(clsPath); 

        realPath=realPath.substring(0,pos-1); 

        //如果类文件被打包到JAR等文件中时,去掉对应的JAR等打包文件名 

        if (realPath.endsWith("!")) {

        realPath=realPath.substring(0,realPath.lastIndexOf("/"));

        }

        java.io.File file = new java.io.File(realPath);

        realPath = file.getAbsolutePath();

 

        try 

        realPath=java.net.URLDecoder.decode (realPath,"utf-8"); 

        }catch (Exception e){

        throw new RuntimeException(e);

        } 

        return realPath; 

    }//getAppPath定义结束 

}

 

使用Jar包,在Tomcat的运行结果如下:

ProjectPath: D:\J2EE\Tomcat 6.0\webapps\MyService1WebP\WEB-INF\lib

RealPath: D:\J2EE\Tomcat 6.0\webapps\MyService1WebP\WEB-INF\classes

Apppath: D:\J2EE\Tomcat 6.0\webapps\MyService1WebP\WEB-INF\classes

posted @ 2012-08-25 23:05 蜗牛先生驾到 阅读(6) 评论(0)   编辑

 

java.version

Java  运行时环境版本

java.vendor

Java  运行时环境供应商

java.vendor.url

Java  供应商的 URL

java.home

Java  安装目录

java.vm.specification.version

Java  虚拟机规范版本

java.vm.specification.vendor

Java  虚拟机规范供应商

java.vm.specification.name

Java  虚拟机规范名称

java.vm.version

Java  虚拟机实现版本

java.vm.vendor

Java  虚拟机实现供应商

java.vm.name

Java  虚拟机实现名称

java.specification.version

Java  运行时环境规范版本

java.specification.vendor

Java  运行时环境规范供应商

java.specification.name

Java  运行时环境规范名称

java.class.version

Java  类格式版本号

java.class.path

Java  类路径

java.library.path

加载库时搜索的路径列表

java.io.tmpdir

默认的临时文件路径

java.compiler

要使用的 JIT 编译器的名称

java.ext.dirs

一个或多个扩展目录的路径

os.name

操作系统的名称

os.arch

操作系统的架构

os.version

操作系统的版本

file.separator

文件分隔符(在 UNIX 系统中是“/”)

path.separator

路径分隔符(在 UNIX 系统中是“:”)

line.separator

行分隔符(在 UNIX 系统中是“/n”)

user.name

用户的账户名称

user.home

用户的主目录

user.dir

用户的当前工作目录

 

 

获取的代码示例:

 

[java]    view plain   copy
  1. public   class  SystemProperty {  
  2.     public   static   void  main(String args[]) {     
  3.     System.out.println("java_vendor:"  + System.getProperty( "java.vendor" ));     
  4.     System.out.println("java_vendor_url:"      
  5.              + System.getProperty("java.vendor.url" ));     
  6.     System.out.println("java_home:"  + System.getProperty( "java.home" ));     
  7.     System.out.println("java_class_version:"      
  8.              + System.getProperty("java.class.version" ));     
  9.     System.out.println("java_class_path:"      
  10.             + System.getProperty("java.class.path" ));     
  11.     System.out.println("os_name:"  + System.getProperty( "os.name" ));     
  12.     System.out.println("os_arch:"  + System.getProperty( "os.arch" ));     
  13.     System.out.println("os_version:"  + System.getProperty( "os.version" ));     
  14.     System.out.println("user_name:"  + System.getProperty( "user.name" ));     
  15.     System.out.println("user_home:"  + System.getProperty( "user.home" ));     
  16.     System.out.println("user_dir:"  + System.getProperty( "user.dir" ));     
  17.     System.out.println("java_vm_specification_version:"      
  18.             + System.getProperty("java.vm.specification.version" ));     
  19.     System.out.println("java_vm_specification_vendor:"      
  20.             + System.getProperty("java.vm.specification.vendor" ));     
  21.     System.out.println("java_vm_specification_name:"      
  22.             + System.getProperty("java.vm.specification.name" ));     
  23.     System.out.println("java_vm_version:"      
  24.             + System.getProperty("java.vm.version" ));     
  25.     System.out.println("java_vm_vendor:"      
  26.             + System.getProperty("java.vm.vendor" ));     
  27.     System.out     
  28.             .println("java_vm_name:"  + System.getProperty( "java.vm.name" ));     
  29.     System.out.println("java_ext_dirs:"      
  30.             + System.getProperty("java.ext.dirs" ));     
  31.     System.out.println("file_separator:"      
  32.             + System.getProperty("file.separator" ));     
  33.     System.out.println("path_separator:"      
  34.             + System.getProperty("path.separator" ));     
  35.     System.out.println("line_separator:"      
  36.             + System.getProperty("line.separator" ));     
  37. }     

 

=======================================================================

System.setProperties( "proxySet", "true" );  
System.setProperties( "proxyHost", "192.168.31.117" );  
System.setProperties( "proxyPort", "80" ); 
这里的proxySet,proxyHost,proxyPort等等这些系统的属性名称是从哪里知道的? 

  ——通过JDK文档中对java.lang.system的static Properties getProperties()方法的介绍,可以获知所有可用属性的含义。

  ——根本没有proxySet,proxyHost和proxyPort, 这些是user defined property,那么用户定义的属性如何起作用的?

***JavaVM实现Proxy的方法***

      要想让java应用使用代理连接网络,只需要设置一下system properties,有两种方法可以设置,一是直接在java代码里面调用System.setProperty()方法,还有就是通过-D选项添加 java虚拟机参数,如  java -Dhttp.proxyHost=192.168.254.254     -Dhttp.proxyPort=9000 ,当然也可以指定不使用代理访问的网站或者主机,http.nonProxyHosts属性指定不使用代理访问的域。示例如下所示:

      System.setProperty("http.proxyHost", "192.168.254.254");

      System.setProperty("http.proxyPort", "9000");

      System.setProperty("http.nonProxyHosts", "localhost");

      如果你想使用ftp代理可以以相同的方式设定如下系统属性:ftp.proxyHost, ftp.proxyPort , and 使用socket代理可以设定socks.ProxyHost socks.ProxyPort 也可以使用如下代码:

  1. Properties sysProperties = System.getProperties();   
  2. //Specify proxy settings   
  3. sysProperties.put("proxyHost", "myhost");//myhost设置为代理的地址   
  4. sysProperties.put("proxyPort", "myport");//myport设置为代理端口  
  5. sysProperties.put("proxySet",  "true");  

补充:

      Java网络代理服务器环境变量
      Java 是一种面向对象的网络语言,Java 的JVM已经提供了可以设置与网络代理服务相关的环境变量,这些环境变量是按照键值名(Key)和值(Value)实现配置的。而这些环境变量与应用程序 息息相关。比如:大家比较熟悉的classpath环境变量等。从表面上看,JVM的环境变量有点类似Windows的*.ini,该环境变量是按照纯文 本的格式存储的。

      Http 代理服务是目前Internet环境下,应有最为广泛的代理服务。一般的网络浏览器,如:微软的IE和网景的Netscape都提供对Http代理服务的 配置选项。在Java应用程序中,对Http代理服务的使用是通过配置Java 虚拟机的JVM的环境变量来实现的。针对http代理服务,Java 虚拟机提供了如下环境变量:

      http.proxySet 该环境变量用以设置应用程序是否使用http协议代理,值为True/False。 
            注意:在设置环境变量时候,变量值True/False是按照字符串的形式进行设置的。 
      http.proxyHost 该环境变量用以设置应用程序所使用的http协议代理服务器的主机,比如:我们使用 http://172.14.10.34  作为http的代理服务器主机。 
      http.proxyport 该环境变量用以设置应用程序所使用的http协议代理服务器的主机的端口号。比如:我们使用 http://172.14.10.34  的8080端口作为http的代理服务器。

如:将Java应用程序的Http代理服务器设为http://172.14.10.34 ,端口为8080,可以使用如下代码: 
String host="http://172.14.10.34 ";
String port="8080";
System.setproperty("http.proxySet", "true");
System.setproperty("http.proxyHost", host);
System.setproperty("http.proxyport", port);


一旦设置好了Java应用程序的http代理环境变量,Java应用程序就可以通过http代理服务透明地访问与http相关的网络资源。