【Java】本地开发环境正常、测试或生产环境获取的文件路径不对的问题

Java 中经常获取本地文件或者resource下的文件,要获取文件,首先要获得本地路径。

Java 本身或一些开源工具包都提供了很多获取路径的方法。但使用时经常遇到本地开发环境正常、测试或生产环境获取的文件路径不对的问题。

本文将列出几种常见的获取本地文件的方法,并对比它们在打包前后的差异。

示例代码

package com.xzbd;

import java.io.File;

public final class Application {

    public static void main(String[] args) {
        System.out.println("测试 Java 获取本地文件路径:");

        System.out.println("【User Home 路径】:\r\n\t" + getUserHome());

        System.out.println("【User Dir 路径】:\r\n\t" + getUserDir());

        System.out.println("【Resource 路径】:\r\n\t" + getResourcePath());

        System.out.println("【Jar 路径】:\r\n\t" + getJarPath());

    }

    public static String getJarPath() {
        String jarPath = Application.class.getProtectionDomain().getCodeSource().getLocation().getPath();
        return new File(jarPath).getAbsolutePath();
    }

    public static String getResourcePath() {
        String appPath = Application.class.getResource(File.separator).getPath();
        return new File(appPath).getAbsolutePath();
    }

    public static String getUserHome() {
        String userhome = System.getProperty("user.home");
        if (userhome == null) {
            return "";
        }
        return userhome;
    }

    public static String getUserDir() {
        String userdir = System.getProperty("user.dir");
        if (userdir == null) {
            return "";
        }
        return userdir;
    }

}

未打包前运行结果

PS D:\z_workspace\dirdemo>  & 'D:\apps\Java\jdk-17.0.7\bin\java.exe' '-XX:+ShowCodeDetailsInExceptionMessages' '-cp' 'D:\z_workspace\dirdemo\target\classes' 'com.xzbd.Application'
测试Java获取本地文件路径:
【User Home 路径】:
        D:\Users\74511
【User Dir 路径】:
        D:\z_workspace\dirdemo
【Resource 路径】:
        D:\z_workspace\dirdemo\target\classes\com\xzbd\%5c
【Jar 路径】:
        D:\z_workspace\dirdemo\target\classes
PS D:\z_workspace\dirdemo>

在这里插入图片描述

从上图最后一行可以看到,当前项目路径为 :D:\z_workspace\dirdemo

打包后运行结果

打包使用 Maven ,因为不是可运行 jar ,所以使用如下命令运行。
运行命令

D:\apps\Java\jdk-11.0.11\bin\java.exe -cp .\dirdemo-1.0.0.jar com.xzbd.Application 

执行结果

PS D:\z_workspace\dirdemo\target>
PS D:\z_workspace\dirdemo\target> D:\apps\Java\jdk-11.0.11\bin\java.exe -cp .\dirdemo-1.0.0.jar com.xzbd.Application 
测试 Java 获取本地文件路径:
【User Home 路径】:
        D:\Users\74511
【User Dir 路径】:
        D:\z_workspace\dirdemo\target
获取不到 resource目录
【Resource 路径】:

【Jar 路径】:
        D:\z_workspace\dirdemo\target\dirdemo-1.0.0.jar
PS D:\z_workspace\dirdemo\target>

结果

  • user home: 两种方式获得的路径一致
  • user dir:两种方式获得的路径不一致,但都是运行程序当前触发的路径
  • resource路径: 两种方式不一致,使用时慎重,要测试
  • jar 路径: 两种方式不一致。未打包前目录是编译后class文件所在的根目录 target。打包后获取到了 jar 的绝对路径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/127757.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

盘点那些开发中经常用到的git命令

入职第一天 配置邮箱账号 git config —global user.email "XXXX" git config —global user.name "XXXX" 生成公钥 ssh-keygen -t rsa -C "你的邮箱"生成的文件默认在c盘:/用户/当前用户/.ssh文件夹下,也可以指定文件 打开git网页&…

【正点原子STM32连载】 第四十九章 SD卡实验 摘自【正点原子】APM32F407最小系统板使用指南

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html## 第四…

对Mysql和应用微服务做TPS压力测试

1.对Mysql 使用工具:mysqlslap工具 使用命令: mysqlslap -uroot pGG8697000!#--auto generate sql -auto generate sql-load typemixed-concurrency100,200 - number of queries1000-iterations10 - number-int-cols7 - number-charcols13auto genera…

105.am40刷机(linux)折腾记1-前期的准备工作1

前段时间在某鱼上逛的时候,发现一款3399的盒子只要150大洋,内心就开始澎拜,一激动就下手了3台,花了450大洋(现在想想,心都碎了一地)。 然后自己又来来回回折腾了几天,目前能跑上fire…

NodeJs - 集合对象序列化问题

NodeJs - 集合对象序列化问题 一. 集合对象的序列化问题1.1 Map 和 Object 的区别1.2 Map 的相关转换Map 和 Array 互转Map 和 Object 互转 1.3 Set 的相关转换Set 和 Array 互转 一. 集合对象的序列化问题 案例如下:我们创建一个Map和一个Set集合,并用…

6、规划绩效域

1、变更 (1)变更有哪几种原因(类型)? 纠正措施(比如进度落后了,我们会有赶工和快速跟进的措施) 缺陷补救 预防措施 更新措施 2、变更的目的和变更控制流程的意义 考点1&#…

PSP - 蛋白质复合物结构预测 Template Pair 特征 Mask 可视化

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/134333419 在蛋白质复合物结构预测中,在 TemplatePairEmbedderMultimer 层中 ,构建 Template Pair 特征的源码&#xff0c…

字符串取出多余空格的三种方法

151.翻转字符串里的单词 力扣题目链接(opens new window) 这个题的解题思路如下: 移除多余空格将整个字符串反转将每个单词反转 这个题的难点是去除多余的空格,下面我将详细讲解一下去除多余空格的几种方法。 第一种方法是逐个字符的去遍历&#xff…

CentOS 7 双网卡绑定热备 —— 筑梦之路

为什么需要? 1. 增强网络的可靠性 2. 保障服务的可持续性 3. 降低网卡故障带来的不良影响 有哪些模式? 模式0:轮询策略(round robin),mode0,优点:流量提高一倍缺点:需要接…

Pytorch实战教程(一)-神经网络与模型训练

0. 前言 人工神经网络 (Artificial Neural Network, ANN) 是一种监督学习算法,其灵感来自人类大脑的运作方式。类似于人脑中神经元连接和激活的方式,神经网络接受输入,通过某些函数在网络中进行传递,导致某些后续神经元被激活,从而产生输出。函数越复杂,网络对于输入的数…

UE5蓝图接口使用方法

在内容区右键创建蓝图接口 命名自定义(可以用好识别的) 双击打开后关闭左边窗口 右键函数 -- 重命名 -- 名称自定义(用好记的) 点击下边输入后面的 号创建一个变量 点击编译并保存 在一个蓝图类里面 -- 点击类设置 在右侧已实现的…

修改Android Studio默认的gradle目录

今天看了一下,gradle在C盘占用了40多G。我C盘是做GHOST的,放在这里不方便。所以就要修改。 新建目录名(似乎无必要) ANDROID_SDK_HOMEG:\SOFTWARES\android-sdk GRADLE_USER_HOMEG:\SOFTWARES\.gradle 修改目录 File->Setti…

Html 引入element UI + vue3 报错Failed to resolve component: el-button

问题&#xff1a;Html 引入element UI vue3 &#xff0c;el-button效果不出来 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><!-- import Vue before Element --> <!-- <script src"https://unpkg.com/vue2/dist…

nginx https 如何将部分路径转移到 http

nginx https 如何将部分路径转移到 http 我有一个自己的网站&#xff0c;默认是走的 https&#xff0c;其中有一个路径需要走 http。 实现 在 nginx 的配置文件 https 中添加这个路径&#xff0c;并添加一个 rewrite 的指令。 比如我需要将 tools/iphone 的路径转成 http&am…

Python使用腾讯云SDK实现对象存储(上传文件、创建桶)

文章目录 1. 开通服务2. 创建存储桶3. 手动上传文件并查看4. python上传文件4.1 找到sdk文档4.2 初始化代码4.3 region获取4.4 secret_id和secret_key获取4.5 上传对象代码4.6 python实现上传文件 5 python创建桶 首先来到腾讯云官网 https://cloud.tencent.com/1. 开通服务 来…

Java枚举类的使用

说明: 根据设计图抽象的枚举类,一张模板背景图(会改变),二维码(传入参数生成),一个关闭的icon(固定不变) 设计图如下 枚举类 去除重复模板后共五个,根据需求编写枚举类如下,url则对应不同的模板,编写成后台人员的可配置项, public enum ImageTemplateEnum {PURCHASE("p…

Python 实践

文章目录 一、HttpRequests 一、Http Requests python——Request模块

Ionic组件 ion-list ion-list-header

1 ion-list 列表由多行项目组成&#xff0c;这些项目可以包含 text, buttons, toggles, icons, thumbnails等。列表通常包含具有类似数据内容的项目&#xff0c;如 images and text。 列表支持多种交互&#xff0c;包括滑动项目以显示选项、拖动以重新排列列表中的项目以及删除…

GCC + Vscode 搭建 nRF52xxx 开发环境

在 Windows 下使用 GCC Vscode 搭建 nRF52xxx 开发环境 ...... by 矜辰所致前言 最近有遇到项目需求&#xff0c;需要使用到 Nordic 的 nRF52xxx 芯片&#xff0c;还记得当初刚开始写博文的时候的写的 nRF52832 学习笔记&#xff0c;现在看当时笔记毫无逻辑可言&#xff0c…

〔003〕虚幻 UE5 基础教程和蓝图入门

✨ 目录 ▷ 新建项目▷ 快捷操作▷ 镜头移动速度▷ 新建蓝图关卡▷ 打印字符串▷ 蓝图的快捷键▷ 场景中放置物体▷ 通过蓝图改变物体位置▷ 展现物体运动轨迹▷ 队列运行▷ 新建项目 打开虚幻启动程序,选择 引擎版本 后点击 启动选择 游戏 类型,默认设置中选择 蓝图,项目名…