java获得路径的多种方式
本文讲解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获得路径的多种方式的更多相关文章
- Java调用DLL有多种方式,常用的方式有JNative、JNA、JNI等。
JNative方式调用dll JNative是一种能够使Java语言使调用DLL的一种技术,对JNI进行了封装,可能有些读者会有这样一个问题,JNative对JNI进行了封装,并且是一种跨语言的使用D ...
- java创建线程的多种方式
java创建线程的四种方式 1.继承 Thread 类 通过继承 Thread 类,并重写它的 run 方法,我们就可以创建一个线程. 首先定义一个类来继承 Thread 类,重写 run 方法. 然 ...
- java调用redis的多种方式与心得
心得: /** * 心得: * 1.连接方式主要有:直连同步,直连事务,直连管道,直连管道事务,分布式直连同步,分布式直连管道, * 分布式连接池同步,分布式连接池管道:普通连接池同步,普通连接池管道 ...
- java 获取classpath下文件多种方式
java 获取classpath下文件多种方式 一:properties下配置 在resources下定义server.properties register.jks.path=classpath\: ...
- Java多种方式读文件,追加文件内容,等对文件的各种操作
一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内容 4.随机读取文件内容 import java.io.BufferedReader; import jav ...
- Java中测试异常的多种方式
使用JUnit来测试Java代码中的异常有很多种方式,你知道几种? 给定这样一个class. Person.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- java中多种方式读文件
转自:http://www.jb51.net/article/16396.htm java中多种方式读文件 一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内 ...
- Java中路径相关的获取方式
[参考文章]:Java文件路径(getResource) [参考文章]:关于java:如何获取正在运行的JAR文件的路径? [参考文章]:关于Class.getResource和ClassLoader ...
- Intellij IDEA 打包jar的多种方式
IDEA打包jar包的多种方式 用IDEA自带的打包形式 用Maven插件maven-shade-plugin打包 用Maven插件maven-assembly-plugin打包 1.view-> ...
随机推荐
- python实现视频下载
最近一两年短视频业务风生水起,各个视频网站都有各自特色的短视频内容.如果有这样一个程序,可以把各大视频网站的热门用户最新发布的视频都下载下来,不仅方便自己观看,还可以将没有版权的视频发布在个人社交网站 ...
- Codevs2776 寻找代表元
2776 寻找代表元 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 广州二中苏元实验学校一共有n个社团,分别用1到n编号 ...
- loadrunner:判断是否服务器连接池瓶颈
分析Web Resources中的Connections per second可以判断是否服务器连接池瓶颈. connections per second会给出两种不同状态的连接数:中断的连接和新建的 ...
- c++ 构造函数以及explicit 关键字的使用
关于构造函数中的隐式转换: 在一个类所定义的构造函数中,存在如下的用法: #pragma once #ifndef __EXERCISE__ #define __EXERCISE__ #include ...
- 【转载】扩展Robot Framework,实现失败用例自动再执行(失败重跑)
使用自动化脚本进行测试,经常受环境影响等各方面导致本能成功的脚本失败,下面介绍了RFS框架下,失败重跑的方法: 通过改写RobotFramework源代码增加--retry选项,实现test级别的失败 ...
- 'utf8' codec can't decode byte 0xd1 in position 931: invalid continuation byte解决方法
有时候,我得到这样的字符œ导致的UnicodeDecodeError错误. 我需要能够使串的UTF-8有或没有这些字符. 在工作中,经常遇到,读取一个文件,或者是从网页获取一个问题,明明看着是gb23 ...
- vpn的实现原理
由于公共IP的短缺,我们在组建局域网时,通常使用保留地址作为内部IP,(比如最常用的C类保留地址:192.168.0.0-192.168.255.255)这些地址是不会被互联网分配的,因此它们在互联网 ...
- C++标准库之vector(各函数及其使用全)
原创作品,转载请注明出处:http://www.cnblogs.com/shrimp-can/p/5280566.html iterator类型: iterator:到value_type的访问,va ...
- 初识vuex
1.简介 vuex是 vue官方推荐的一个状态管理器.当我们遇到很多状态改变时,组件之间的通信就会变得复杂,这时候vuex的强大就展现出来. 我们从vuex的原理以及vuex的api两个部分介绍vue ...
- 27. Remove Element - 移除元素-Easy
Description: Given an array and a value, remove all instances of that value in place and return the ...