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()得到的是正确路径
如下图:

Java开发中关于资源路径获取问题

Java开发中关于资源路径获取问题
下面代码用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();

都要获取,并进行判断,最终得到准确的根路径。

Original: https://www.cnblogs.com/gr13811787801/p/16149525.html
Author: 守护一一
Title: Java开发中关于资源路径获取问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570955/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 双缓冲绘图

    双缓冲绘图 大家小时候都玩过飞机大战吧,当我们在玩这种飞行射击类游戏时,背景图总是不断地向下移动的,从而给我们营造出一种飞机正在向前飞行的游戏体验。那么,图片的快速变化是如何实现的…

    Java 2023年6月5日
    072
  • openresty操作mongodb

    最近项目中使用openresty,需要通过openresty连接mongo,经过几番折腾终于有了一个结果,现将其记录下来,也感谢模块提供者 使用openresty操作mongo 1…

    Java 2023年6月8日
    072
  • 久经沙场的程序员居然也被某鱼的假程序员骗了,程序员之间的信任应该是最高的,他一个人毁了这种信任感

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    046
  • Java并发杂谈(一):volatile的底层原理,从字节码到CPU

    volatile的特性 volatile是Java中用于修饰变量的关键字,其主要是保证了该变量的可见性以及顺序性,但是没有保证原子性;其是Java中最为轻量级的同步关键字;接下来我…

    Java 2023年6月7日
    090
  • Spring Cloud Gateway 不小心换了个 Web 容器就不能用了

    最近组员修改微服务的一些公共依赖,在某个依赖中需要针对我们微服务使用的 Undertow 容器做一些订制,所以加入了 web 容器 Undertow 的依赖。但是,一般这种底层框架…

    Java 2023年6月7日
    0144
  • 鸿蒙(HarmonyOS)开发笔记三:核心概念

    harmonyOS开发中的核心概念: 1. Ability和Slice Alibity是harmonyOS开发的核心,首先了解一下什么是Alibity我们用生活中的例子来做一个类比…

    Java 2023年6月16日
    066
  • 浅谈java代理模式

    讲解java代理模式 讲解java代理模式 何谓代理模式 静态代理 动态代理 JDK动态代理 CGLIB动态代理 何谓代理模式 代理&a…

    Java 2023年6月7日
    086
  • java宝典笔记(一)

    第四章java 基础知识 4.1 基本概念 一、java 优点 1.面向对象(封装、继承、多态) 2.可移植性。平台无关,一次编译,到处运行。Windows ,Linux ,mac…

    Java 2023年6月7日
    068
  • 【Java面试手册-基础篇】能否声明main()方法为private或protected,或者不用访问修饰符?

    答案是否定的,main()方法必须public,不能定义main()方法为private和protected,也不能不用访问修饰符。 这是为了能让JVM访问main()方法,如果不…

    Java 2023年6月8日
    076
  • SpringBoot整合SpringCloud

    1、先创建一个空工程,然后创建注册中心模块(Eureka)、服务消费者和服务提供者 ​ 注册中心 服务消费者 服务提供者 2、注册中心配置 在application.yml配置 s…

    Java 2023年6月7日
    061
  • java学习之多线程

    0x00前言和思维导图 1.什么是进程?什么事线程?我们可以这样理解,一个qq相当于一个进程,你同时间跟几个人聊qq你每一个聊天框就相当于线程(线程就是进程的每一个执行场景/执行单…

    Java 2023年6月13日
    070
  • Java 最常见 200+ 面试题全解析:面试必备(转)

    本文分为十九个模块,分别是: Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/S…

    Java 2023年5月29日
    060
  • SpringBoot-Test测试

    @RunWith(SpringRunner.class) @SpringBootTest(classes = com.aa.Application.class, webEnviro…

    Java 2023年6月9日
    077
  • 5分钟了解Redis的内部实现跳跃表(skiplist)

    跳跃表简介 跳跃表(skiplist)是一个有序的数据结构,它通过在每个节点维护不同层次指向后续节点的指针,以达到快速访问指定节点的目的。跳跃表在查找指定节点时,平均时间复杂度为,…

    Java 2023年6月7日
    073
  • 观察者模式详解

    观察者模式 1.1观察者模式概述 观察者模式(Observer Pattern)又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式。…

    Java 2023年6月7日
    061
  • 把路径下的图片添加水印

    添加水印 这些图片来在 极简壁纸 ,均用于实验 我写了一个方法,可以选择路径,把里面的所有jpg或者png的图片都添加上属于自己的水印 请看代码 import javax.imag…

    Java 2023年6月7日
    080
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球