本文讲解java语言中获得运行时路径的多种方式,包括java项目、java web项目、jar、weblogic等多种场景。

一、this.getClass().getClassLoader().getResource("").getFile()

示例:

String path = this.getClass().getClassLoader().getResource("").getFile();
path = URLDecoder.decode(path,"utf-8");

注意当路径中包含空格、中文等特殊字符时,需要进行转码,否则结果会是这样的:/D:/eclipse%e5%b7%a5%e4%bd%9c%e7%a9%ba%e9%97%b4/Test/bin/

使用这种方式,就不用转码了:

this.getClass().getClassLoader().getResource("").toURI().getPath()

适用场景:

java项目,spring-boot项目源码运行,javaweb项目源码部署到tomcat、weblogic中运行,javaweb项目打包war部署到tomcat运行

不适用场景:

spring-boot项目打包成可执行jar运行,javaweb项目打包war部署到weblogic运行

二、this.getClass().getProtectionDomain().getCodeSource().getLocation()

示例:

private String getBasePath() throws Exception {
        CodeSource codeSource = this.getClass().getProtectionDomain().getCodeSource();
        URL location = codeSource == null ? null : codeSource.getLocation();
        File source = null;
        if (location != null) {
            URLConnection connection = location.openConnection();
            if (connection instanceof JarURLConnection) {
                JarFile jarFile = ((JarURLConnection) connection).getJarFile();
                String name = jarFile.getName();
                // name类似于:/xiaoyun-core/target/xiaoyun-core-0.0.1.jar!/BOOT-INF/classes
                int separator = name.indexOf("!/");
                if (separator > 0) {
                    name = name.substring(0, separator);
                }
                source = new File(name);
            } else {
                source = new File(location.toURI().getPath());
            }
        }
        String path = null;
        if (source != null && source.exists()) {
            path = source.getParentFile().getAbsoluteFile().getPath();
        }
        return path;
    }

这种方法是参考spring-boot项目的org.springframework.boot.ApplicationHome写的,当项目以源码方式运行,并且路径中包含中文时,ApplicationHome无法获得路径,所以自己重写了一个。(楚霄云原创文章)

适用场景:

spring-boot项目打包成可执行jar运行,spring-boot项目源码运行,java项目源码运行,java项目打包成可执行jar运行

三、<param-name>webAppRootKey</param-name>

示例:

<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>xiaoyun.root</param-value>
</context-param>

在javaweb项目的web.xml中添加上边的xml,tomcat启动时就会把项目的根目录添加到系统变量中,项目中任何地方都可以获得,如果项目只在tomcat中运行,推荐这种方式

代码中可以使用System.getProperty("xiaoyun.root")获得

String path = System.getProperty("xiaoyun.root");

log4j.properties、logback.xml、ehcache.xml等配置文件中可以使用${xiaoyun.root}获得

log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.File = ${xiaoyun.root}/logs/error.log

适用场景:

javaweb项目部署到tomcat6及以上版本运行

不适用场景:

java项目,javaweb项目部署到weblogic运行,javaweb项目部署到tomcat5运行

四、event.getServletContext().getRealPath("/")

示例:

public class WebAppRootListener implements ServletContextListener{
    @Override
    public void contextInitialized(ServletContextEvent event) {
        try{
            String rootPath = event.getServletContext().getRealPath("/");
            // tomcat不是null,以源码部署到weblogic时不是null,以war部署到部分weblogic版本时是null
            if(rootPath==null || !new File(rootPath).exists()){
                URL url = event.getServletContext().getResource("/");
                rootPath = url==null?null:url.getFile();
            }
            // 以war部署到部分weblogic版本时是null
            if (rootPath == null || !new File(rootPath).exists()) {
                URL url = this.getClass().getClassLoader().getResource("/");
                if(url!=null){
                    String path = url.getFile();
                    rootPath = path.substring(0, path.length() - 17);
                }
            }
            if (rootPath != null && new File(rootPath).exists()) {
                rootPath = URLDecoder.decode(rootPath, "utf-8"); // 防止路径中出现空格和中文时乱码
                System.setProperty("xiaoyun.root", rootPath);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {}
}

适用场景:

javaweb项目(支持tomcat和weblogic)

不适用场景:

java项目

五、其它

如果只是想读取配置文件的话, 不建议根据文件路径去读取,应该使用this.getClass().getClassLoader().getResourceAsStream("config.xml")

java获得路径的多种方式的更多相关文章

  1. Java调用DLL有多种方式,常用的方式有JNative、JNA、JNI等。

    JNative方式调用dll JNative是一种能够使Java语言使调用DLL的一种技术,对JNI进行了封装,可能有些读者会有这样一个问题,JNative对JNI进行了封装,并且是一种跨语言的使用D ...

  2. java创建线程的多种方式

    java创建线程的四种方式 1.继承 Thread 类 通过继承 Thread 类,并重写它的 run 方法,我们就可以创建一个线程. 首先定义一个类来继承 Thread 类,重写 run 方法. 然 ...

  3. java调用redis的多种方式与心得

    心得: /** * 心得: * 1.连接方式主要有:直连同步,直连事务,直连管道,直连管道事务,分布式直连同步,分布式直连管道, * 分布式连接池同步,分布式连接池管道:普通连接池同步,普通连接池管道 ...

  4. java 获取classpath下文件多种方式

    java 获取classpath下文件多种方式 一:properties下配置 在resources下定义server.properties register.jks.path=classpath\: ...

  5. Java多种方式读文件,追加文件内容,等对文件的各种操作

    一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内容 4.随机读取文件内容 import java.io.BufferedReader; import jav ...

  6. Java中测试异常的多种方式

    使用JUnit来测试Java代码中的异常有很多种方式,你知道几种? 给定这样一个class. Person.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  7. java中多种方式读文件

    转自:http://www.jb51.net/article/16396.htm java中多种方式读文件 一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内 ...

  8. Java中路径相关的获取方式

    [参考文章]:Java文件路径(getResource) [参考文章]:关于java:如何获取正在运行的JAR文件的路径? [参考文章]:关于Class.getResource和ClassLoader ...

  9. Intellij IDEA 打包jar的多种方式

    IDEA打包jar包的多种方式 用IDEA自带的打包形式 用Maven插件maven-shade-plugin打包 用Maven插件maven-assembly-plugin打包 1.view-> ...

随机推荐

  1. 3403: [Usaco2009 Open]Cow Line 直线上的牛

    3403: [Usaco2009 Open]Cow Line 直线上的牛 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 71  Solved: 62[S ...

  2. 简易漫画网站搭建-漫画喵Server版

    小喵的唠叨话:寒假的时候写了一个漫画爬虫,爬取了好几个漫画,不过一直没有找到合适的漫画阅读的工具.因此最近就试着自己写一个漫画的网站,放在公网上或者局域网里,这样就能随时随地用手机.Pad看漫画了. ...

  3. sass 学习

    本来看了阮一峰和于江水两位老师的博客,有看了ionic自带的sass文件,原以为自己已经是很熟悉,精通了.可是我居然连ruby都不知道真实惭愧啊,辛亏看了www.sass.hk  我想这篇官方文档肯定 ...

  4. 2015.07.20MapReducer源码解析(笔记)

    MapReducer源码解析(笔记)   第一步,读取数据源,将每一行内容解析成一个个键值对,每个键值对供map函数定义一次,数据源由FileInputFormat:指定的,程序就能从地址读取记录,读 ...

  5. css动画特效与js动画特效(一)------2017-03-24

    1.用css做动画效果: 放鼠标才会发生 利用hover <head> <style> #aa{ background-color: red; width: 100px; he ...

  6. Spring Boot 整合 Mybatis 实现 Druid 多数据源详解

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “清醒时做事,糊涂时跑步,大怒时睡觉,独处时思考” 本文提纲一.多数据源的应用场景二.运行 sp ...

  7. java学习笔记 --- 面向对象2

    一.匿名对象 (1)没有名字的对象 (2)应用场景   A:调用方法,仅仅只调用一次的时候. class Car { //描述属性.颜色,轮胎数. String color; int number; ...

  8. iOS开发之Xib和storyboard对比

    相同点: (2)都用来描述软件界面 (2)都用Interface Builder工具来编辑 不同点: (1)Xib是轻量级的,用来描述局部的UI界面 (2)Storyboard是重量级的,用来描述整个 ...

  9. css3特效

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title> ...

  10. 深入浅出分析MySQL MyISAM与INNODB索引原理、优缺点、主程面试常问问题详解

    本文浅显的分析了MySQL索引的原理及针对主程面试的一些问题,对各种资料进行了分析总结,分享给大家,希望祝大家早上走上属于自己的"成金之路". 学习知识最好的方式是带着问题去研究所 ...