博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
获取Java程序运行的路径 | 获取当前jar包的路径
阅读量:6715 次
发布时间:2019-06-25

本文共 2311 字,大约阅读时间需要 7 分钟。

经过试验,不管是否是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

转载于:https://www.cnblogs.com/snailrun/archive/2012/08/25/2657023.html

你可能感兴趣的文章
hello world
查看>>
C语言基础及指针⑦结构体与指针
查看>>
四种常用线程池
查看>>
兼容IE的radio遍历
查看>>
Ossim下RRDTool实战
查看>>
向服务器请求XML数据时中文乱码
查看>>
微信消息接口发送信息到分组和用户,错误代码40003和40008
查看>>
HTTP状态码 错误列表
查看>>
scala依赖限制
查看>>
Font Awesome
查看>>
Dubbo消费者
查看>>
java序列化和持久化
查看>>
thinkphp调试
查看>>
虚拟化中虚拟机处理器核数与物理主机cpu的关系
查看>>
redmine不能发邮件及错误处理“DSN: Service unavailable ”
查看>>
flex学习笔记 flex中的一些错误
查看>>
org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type
查看>>
MYSQL: mysqlbinlog读取二进制文件报错read_log_event()
查看>>
随机产生由特殊字符,大小写字母以及数字组成的字符串,且每种字符都至少出现一次...
查看>>
我的友情链接
查看>>