Java开发中关于资源路径获取问题
描述
在开发中经常会读取配置文件,在Web开发中大多数都是在项目路径下。核心的API类或者是Controller异或是jsp页面等,基本都是基于web应用的相对路径,很少去操作绝对路径,但是在客户端、jar启动方式、exe方式情况下,获取资源文件的路径就会是一个相对不同的问题。
最近公司有个开发需求,非网络的pc客户端处理需求。很多操作都可以收集、编辑放到配置文件去批处理执行,这时候遇到一个问题,就是在打jar包的时候,发现有个诡异的区别。
代码:
点击查看代码
- [JarPropertiesTest main = new JarPropertiesTest();
String root = main.getClass().getResource("/").getPath();//第二次尝试获取路径方法
System.out.println(System.getProperty("user.dir"));
System.out.println("root:" + root);
System.out.println(main.getClass().getProtectionDomain().getCodeSource().getLocation()
.getFile());
String jarpath = main.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();//第一次获取路径方法
System.out.println(jarpath);
jarpath = jarpath.indexOf(".jar") > -1 ? root : jarpath;//第三次为了兼容几种不同结果
// if (jarpath.indexOf(".jar") > -1) jarpath = jarpath.substring(0, jarpath.lastIndexOf("/") +
// 1);
jarpath = jarpath + "configs/config.ini";
Properties properties = new Properties();
try {
properties.load(new FileInputStream(jarpath));
System.out.println(properties.get("params"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} ]
情况描述:
打包方法:Eclipse自带的Export和Ant
Eclipse中打包时,下面代码是生效的,可以直接拿到jar包存放的路径,然后configs目录与jar文件同级,则可以正常执行
采用main.getClass().getProtectionDomain().getCodeSource().getLocation().getPath()
用ant打包时候,采用main.getClass().getProtectionDomain().getCodeSource().getLocation().getPath()方法得到的路径则是jar路径且带jar文件名,是个全路径,需要自己手工去掉多余内容
Eclipse打包时main.getClass().getResource("/").getPath()得到是一个空字符串
ant打包时main.getClass().getResource("/").getPath()得到的是正确路径
如下图:
下面代码用ant打包时候可以正常获取到jar的存放路径,进而可以构建同级目录configs下文件路径
String filePath = System.getProperty("user.dir") + "/configs/config.ini";
总结
对于jar或者exe情况下自动获取相对路径下的文件情况,既要考虑操作系统环境又要考虑打包方式,所以要对根路径进行适配,也就是
String filePath = System.getProperty("user.dir") + "/configs/config.ini";
String root = main.getClass().getResource("/").getPath();
String jarpath = main.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
都要获取,并进行判断,最终得到准确的根路径。
Java开发中关于资源路径获取问题的更多相关文章
- 在idea的java开发中字符串length()方法获取长度与赋值不符的问题
最近在开发中用到length()方法获取中文字符串的长度,发现获得的长度与实际不符.比如个String类型赋值为"中",但获取长度却是2. 这让我百思不得其解,后来突然想起来我在研 ...
- JAVA开发中相对路径,绝对路径全面总结
JAVA开发中相对路径,绝对路径全面总结 博客分类: Java综合 JavaJSP应用服务器Servlet网络应用 1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径, ...
- 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)
编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...
- Java开发中文件读取方式总结
JAVA开发中,免不了要读文件操作,读取文件,首先就需要获取文件的路径. 路径分为绝对路径和相对路径. 在文件系统中,绝对路径都是以盘符开始的,例如C:\abc\1.txt. 什么是相对路径呢?相对路 ...
- [ 转载 ] Java开发中的23种设计模式详解(转)
Java开发中的23种设计模式详解(转) 设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...
- Java开发中常用jar包整理及使用
本文整理了我自己在Java开发中常用的jar包以及常用的API记录. <!-- https://mvnrepository.com/artifact/org.apache.commons/com ...
- java开发中遇到的问题及解决方法(持续更新)
摘自 http://blog.csdn.net/pony12/article/details/38456261 java开发中遇到的问题及解决方法(持续更新) 工作中,以C/C++开发为主,难免与其他 ...
- Java 开发中的对象拷贝
前言 在 Java 开发中,很多时候需要将两个属性基本相同的对象进行属性复制,比如 DO 转 VO等等. 本文主要介绍自己实现的简易拷贝工具类与 Spring 提供的属性拷贝的对比. Spring 提 ...
- Java开发中的eclispe常用快捷键&全部快捷键
Java开发中的eclispe常用快捷键&全部快捷键 Ctrl+1 快速修复(经典快捷键)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ ...
随机推荐
- PCI协议 总结
1.引脚 必要的引脚在左边,任选的引脚在右边 2.CLK in:时钟输入,为所有PCI上的接口传送提供时序.其频率也称为PCI的工作频率. 大部分信号都在CLK的上升沿有效 3.AD0~AD31 t/ ...
- 网络编程 基础 基于socket的tcp和udp连接
网络开发的框架 C/S B/S 架构 程序都是bs架构的程序(b指浏览器,s指服务器) c(client)是客户端,s(server)是服务器 bs架构是cs架构的一种 未来的趋势, pc端bs架构, ...
- go语言学习入门篇 3-- 程序执行流程
先看下 Go 语言的程序结构: package main // 当前包名 import "fmt" // 导入程序中使用到的包 // 初始化函数 func init() { // ...
- 《手把手教你》系列基础篇(八十三)-java+ selenium自动化测试-框架设计基础-TestNG测试报告-下篇(详解教程)
1.简介 其实前边好像简单的提到过测试报告,宏哥觉得这部分比较重要,就着重讲解和介绍一下.报告是任何测试执行中最重要的部分,因为它可以帮助用户了解测试执行的结果.失败点和失败原因.另一方面,日志记录对 ...
- Python -用虚拟环境保存库文件
如果你同时负责多个 Python 项目,或者想要轻松打包某个项目及其关联的库文件,再或者你担心已安装的库之间可能有冲突,那么你可以安装一个 Python 虚拟环境来分而治之.当一个 Python 库不 ...
- SpringAOP 失效解决方案、Spring事务失效
SpringAOP 失效解决方案 SpringAOP是基于代理来对目标方法进行增强,但是有的时候又会出现"增强无效"的情况,比如在@Transactional下的某类中的方法内调用 ...
- redis 过期键的删除策略?
1.定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键 的过期时间来临时,立即执行对键的删除操作. 2.惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的 ...
- 学习k8s(四)
1.K8S核心组件 1.Master节点: etcd: 分布式键值对数据库,保存集群状态 api-server: 接受并响应用户的请求 controller: 控制器管理,控制容器的副本数,故障检测 ...
- Linux运维最常用150个命令
线上查询及帮助命令(2个) man 查看命令帮助,命令的词典,更复杂的还有info,但不常用. help 查看Linux内置命令的帮助,比如cd命令. 文件和目录操作命令(18个) ls 全拼list ...
- Collection单列集合的继承关系(集合的层次结构)