【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 的绝对路径。
### 回答1: 要在64位JDK环境下调用32位DLL文件,您需要执行以下步骤: 1. 确定您的操作系统是否为64位,如果是,请下载并安装32位Java运行时环境(JRE)。 2. 在32位Java JRE中编写代码,以便它可以调用32位DLL文件。请注意,由于32位DLL文件不受64位Java JRE支持,因此必须使用32位Java JRE。 3. 将32位DLL文件复制到您的计算机上,并确保它们位于Java可以找到的位置。可以将其复制到Java路径或系统路径中。 4. 将32位DLL文件Java代码连接起来。您可以使用Java Native Interface(JNI)来实现这一点。 JNI允许Java代码调用本地库(如DLL文件),并且可以在32位Java JRE和64位Java JRE中使用。 5. 在Java代码中使用System.loadLibrary()函数来加载32位DLL文件。 6. 测试您的代码并确保它可以正确调用32位DLL文件。 ### 回答2: 在64位JDK环境中调用32位DLL文件问题可以通过以下步骤解决: 1. 确认操作系统:首先需要确保操作系统是64位版本的。如果操作系统是32位的,那么无论使用哪个版本的JDK,都只能调用32位DLL文件。 2. 安装32位JDK:在64位JDK环境中调用32位DLL文件,需要安装32位的JDK。因为32位DLL文件是由32位JDK生成的,所以只有相同位数的JDK能够正确地加载并调用DLL文件。 3. 配置环境变量:将32位JDK的安装路径添加到系统的环境变量中。这样,可以确保在命令行或其他开发工具中使用32位JDK进行编译和运行程序。 4. 设置Java路径:在Java代码中,使用System.setProperty("java.library.path", "DLL文件路径")指定DLL文件路径。这样,JVM会在指定的路径中找到并加载32位DLL文件。 5. 使用32位JRE:如果使用的是JRE而不是JDK,同样需要安装32位的JRE,并在环境变量中配置正确的JRE路径。 需要注意的是,64位JDK环境中调用32位DLL文件可能会导致兼容性问题。因此,建议尽可能使用相同位数的JDK和DLL文件。如果DLL文件是由第三方提供的,可以尝试联系DLL文件的提供方,获取64位版本的DLL文件。 总结起来,解决64位JDK环境中调用32位DLL文件问题,需要确认操作系统位数,安装相同位数的JDK或JRE,并配置正确的环境变量和Java路径。 ### 回答3: 要在64位JDK环境中调用32位DLL文件,我们需要采取以下解决方法: 1. 选择32位JDK环境:如果可能的话,可以考虑安装32位JDK环境,因为32位JDK环境能兼容32位DLL文件。这样就可以直接使用32位JDK环境调用32位DLL文件,无需做其他处理。 2. 使用Java Native Interface(JNI):JNI是Java提供的一种机制,允许Java代码调用本地语言的函数。通过编写桥接函数,将Java代码与DLL文件连接起来。在编写JNI函数时,需要根据DLL文件调用规范(例如C调用规范)进行适当的声明和封装。 3. 使用Java Native Access(JNA)库:JNA是一个开源库,可以简化Java调用本地函数的过程。通过使用JNA库,在Java代码中声明和定义DLL文件的函数和数据结构,使得可以直接调用32位DLL文件中的函数。在JNA中,没有必要编写JNI函数,而是通过直接调用DLL文件的函数来实现功能。 4. 通过进程间通信(IPC):如果以上方法都无法解决问题,可以考虑通过IPC与一个32位进程进行通信。在32位进程中加载32位DLL文件,并提供接口让64位JDK环境中的Java代码调用。可以使用进程间通信机制,如共享内存或管道,实现Java代码与32位进程之间的数据交换和通信。 以上是解决64位JDK环境中调用32位DLL文件的一些方法。根据具体情况选择适合的解决方案,并根据需求进行详细实施和测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值