描述

在开发中经常会读取配置文件,在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开发中关于资源路径获取问题的更多相关文章

  1. 在idea的java开发中字符串length()方法获取长度与赋值不符的问题

    最近在开发中用到length()方法获取中文字符串的长度,发现获得的长度与实际不符.比如个String类型赋值为"中",但获取长度却是2. 这让我百思不得其解,后来突然想起来我在研 ...

  2. JAVA开发中相对路径,绝对路径全面总结

    JAVA开发中相对路径,绝对路径全面总结 博客分类: Java综合 JavaJSP应用服务器Servlet网络应用 1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径, ...

  3. 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)

    编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...

  4. Java开发中文件读取方式总结

    JAVA开发中,免不了要读文件操作,读取文件,首先就需要获取文件的路径. 路径分为绝对路径和相对路径. 在文件系统中,绝对路径都是以盘符开始的,例如C:\abc\1.txt. 什么是相对路径呢?相对路 ...

  5. [ 转载 ] Java开发中的23种设计模式详解(转)

    Java开发中的23种设计模式详解(转)   设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...

  6. Java开发中常用jar包整理及使用

    本文整理了我自己在Java开发中常用的jar包以及常用的API记录. <!-- https://mvnrepository.com/artifact/org.apache.commons/com ...

  7. java开发中遇到的问题及解决方法(持续更新)

    摘自 http://blog.csdn.net/pony12/article/details/38456261 java开发中遇到的问题及解决方法(持续更新) 工作中,以C/C++开发为主,难免与其他 ...

  8. Java 开发中的对象拷贝

    前言 在 Java 开发中,很多时候需要将两个属性基本相同的对象进行属性复制,比如 DO 转 VO等等. 本文主要介绍自己实现的简易拷贝工具类与 Spring 提供的属性拷贝的对比. Spring 提 ...

  9. Java开发中的eclispe常用快捷键&全部快捷键

    Java开发中的eclispe常用快捷键&全部快捷键 Ctrl+1 快速修复(经典快捷键)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ ...

随机推荐

  1. S2-048(RCE远程代码执行)

    环境搭建: https://blog.csdn.net/qq_36374896/article/details/84145020 进入漏洞环境 cd vulhub-master/struts2/s2- ...

  2. Fegin 的使用

  3. Oracle Yum源

    仓库地址(非Yum源仓库):https://public-yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/index.html 如何连接到 Orac ...

  4. springboot监听kafka(不使用spring-kafka)

    一.不使用spring-kafka的原因 kafka服务端版本为0.10.0.1-Ipv20191220-hbp2.1.0,为避免版本问题导致监听失败,客户端也采用0.10.0.1版本,客户端0.10 ...

  5. JavaScript中call如何使用?

    一句话概括:call是函数才能调用的方法.作用是改变属性环境.有点绕,举个例子. 此处代码是在window环境下声明的变量和函数. var name='王延朋'; var age=18; var ex ...

  6. MySQL安装速成指南(ZIP)

    MySQL初始化数据库 第一步:将MySQL ZIP压缩包进行解压 第二部:在MySQL主目录创建my.ini文件,并添加以下内容 [client] port=3306 socket=/tmp/mys ...

  7. 指出在 spring aop 中 concern 和 cross-cutting concern 的不同之处?

    concern 是我们想要在应用程序的特定模块中定义的行为.它可以定义为我们想 要实现的功能. cross-cutting concern 是一个适用于整个应用的行为,这会影响整个应用程序. 例如,日 ...

  8. Java 中,抽象类与接口之间有什么不同?

    Java 中,抽象类和接口有很多不同之处,但是最重要的一个是 Java 中限制一个 类只能继承一个类,但是可以实现多个接口.抽象类可以很好的定义一个家族类 的默认行为,而接口能更好的定义类型,有助于后 ...

  9. MySQL优化篇(一),我可以和面试官多聊几句吗?——SQL优化流程与优化数据库对象

    我可以和面试官多聊几句吗?只是想偷点技能过来.MySQL优化篇(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. MyISAM表锁和InnoD ...

  10. HTTP1.1、HTTP2、HTTP3 演变

    推荐阅读:https://www.cnblogs.com/zwtblog/tag/计算机网络/ 目录 HTTP 基本概念 HTTP/1.1 相⽐ HTTP/1.0 提⾼了什么性能? HTTP/1.1如 ...