在JAVA中,当从JAR运行时,如何获取定位文件的文件路径?

在JAVA中,当从JAR运行时,如何获取定位文件的文件路径?,java,maven,classloader,filepath,executable-jar,Java,Maven,Classloader,Filepath,Executable Jar,我的项目具有以下结构: src/test/resources/utility/configuration.xml 我正在尝试使用ClassLoader获取系统中的文件位置 public File getFileFromResources(String fileName){ ClassLoader classLoader = getClass().getClassLoader(); URL resource = classLoader.getResource(

我的项目具有以下结构:

src/test/resources/utility/configuration.xml
我正在尝试使用ClassLoader获取系统中的文件位置

public File getFileFromResources(String fileName){

        ClassLoader classLoader = getClass().getClassLoader();

        URL resource = classLoader.getResource(fileName);
        if(resource == null){
            throw new IllegalArgumentException("file not found");
        }else{
            return new File(resource.getFile());
        }
调用方法:

File file = getFileFromResources("Utility/ConfigurationXML.xml");
strFilePath = file.getAbsolutePath();
它给出了目标文件夹中文件的绝对路径

上面的代码在EclipseIDE中运行良好,但是当我创建项目JAR时,getFileFromResources返回我

文件:/C:/Users/UserName/Desktop/ExecutableJAR/TestJAR-tests.jar/实用程序/ConfigurationXML.xml


我正在使用Maven构建我的项目。

正如您的路径所示,响应资源是您测试资源的一部分。生产代码无法访问测试资源,而测试代码可以访问生产资源。如果您在生产中需要此特定资源,则需要将其移动到生产资源文件夹hierarcy,该文件夹通常为src/main/resources/utility/configuration.xml

JAR文件中不包括测试资源和类,因为这被视为生产代码。

正如所述,生产代码无法访问测试资源

在根级别没有任何称为资源的标准


src/main/resources通常是放置非Java工件的位置,这些工件应该移动到正常的包层次结构中,就像加载为类路径资源的XML配置文件一样。

我也遇到了同样的问题。使用netbeans,它在命令行java-jar jarname.jar中不起作用。我最终将我的ressource文件放在项目根目录下的一个文件夹中,然后在构建jar后,我将该文件夹移动到与jar文件相同的位置。
它可以工作

和文件:/C:/Users/UserName/Desktop/ExecutableJAR/TestJAR-tests.jar/实用工具/ConfigurationXML.xml不好,因为。。。?您可能需要添加实际问题。资源不是文件。它们在JAR或WAR文件中。您已经有了获取资源URL的代码,并且可以从中获取输入流。除了@user207421的注释外,如果安装了适当的文件系统,还可以将URL转换为路径。对于普通文件(默认文件系统、jar/zip文件和模块映像),情况就是这样,但是对于jar/zip文件,您必须首先显式地创建文件系统。另见。但在大多数情况下,打开输入流或直接将URL传递给(例如XML解析器)已经足够了。只有在调用JAR文件时,该位置是当前工作目录时,它才起作用。但这不是您所说的,这是对您答案的一个重要限定…….构建jar后,我将该文件夹移动到与jar文件相同的位置当前工作目录与jar文件的位置不同。否在开发模式下使用netbeans时,您将资源放在*当前工作目录*中,在生产模式下,您将其移动到编译时,src/test/resources中的所有元素都被复制到目标文件夹中,我可以从那里编译,因为返回的绝对路径是目标文件夹的路径,但创建jar时却不是这样。除了将文件移动到src/main/之外,还有其他方法吗?没有其他方法,任何其他方法都是错误的。产品环境中没有测试资源的位置。他们不属于那里。