• 【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;
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    未打包前运行结果

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    从上图最后一行可以看到,当前项目路径为 :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 
    
    • 1

    执行结果

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    结果

    • user home: 两种方式获得的路径一致
    • user dir:两种方式获得的路径不一致,但都是运行程序当前触发的路径
    • resource路径: 两种方式不一致,使用时慎重,要测试
    • jar 路径: 两种方式不一致。未打包前目录是编译后class文件所在的根目录 target。打包后获取到了 jar 的绝对路径。
  • 相关阅读:
    力扣(LeetCode)算法_C++——替换后的最长重复字符
    物联网组件
    毕业设计-基于机器视觉的口罩佩戴检测识别
    数据结构(线性表-队列)
    vue的css取消滑动条,适应在不同的屏幕上
    【力扣每日一题】2023.10.11 奖励最顶尖的k名学生
    Android 11.0 12.0当安装多个播放器时,设置默认播放器播放歌曲
    Jenkins流水线部署模板,编译、部署、关闭、回滚流水线脚本
    [RCTF 2019]Nextphp
    基于nodejs+vue驾校预约管理系统
  • 原文地址:https://blog.csdn.net/m0_47406832/article/details/134332870