【问题标题】:How to get filepath of the located file when ran from JAR in JAVA?从JAVA中的JAR运行时如何获取定位文件的文件路径?
【发布时间】:2019-12-04 07:44:46
【问题描述】:

我的项目结构如下:

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();

这给了我文件的绝对路径,它位于目标文件夹中。

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

file:/C:/Users/UserName/Desktop/ExecutableJAR/TestJAR-tests.jar!/Utility/ConfigurationXML.xml

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

【问题讨论】:

  • file:/C:/Users/UserName/Desktop/ExecutableJAR/TestJAR-tests.jar!/Utility/ConfigurationXML.xml 不好,因为... ?您可能想添加一个实际问题。
  • 资源不是文件。它们位于 JAR 或 WAR 文件中。您已经有了获取资源 URL 的代码,并且可以从中获取输入流。这就是你所需要的。
  • 除了@user207421 的注释之外,如果安装了适当的FileSystem,您可以将URL 转换为Path。普通文件(默认文件系统)、jar/zip 文件和模块映像就是这种情况,但对于 jar/zip 文件,您必须首先显式创建文件系统。另见this answer。但对于大多数目的,打开输入流或直接将URL 传递给例如XML解析器,已经足够了。

标签: java maven classloader filepath executable-jar


【解决方案1】:

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

测试资源(和类)不包含在 JAR 文件中,因为它被视为生产代码。

【讨论】:

  • 在编译时,src/test/resources 中的整个元素被复制到目标文件夹,我可以从那里编译,因为返回的绝对路径是目标文件夹的路径,但事实并非如此创建 JAR 时。除了将文件移动到 src/main/ 之外还有其他方法吗
  • 没有其他方法,任何其他方法都是错误的。在生产环境中没有测试资源的位置。他们只是不属于那里。
【解决方案2】:

正如@Nicktar所说“生产代码无法访问测试资源”

对于任何称为资源的根级别的东西都没有标准。

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

【讨论】:

    【解决方案3】:

    我在使用 netbeans 时遇到了同样的问题(它在命令行中不起作用 java -jar jarname.jar
    我最终将我的资源文件放在了项目的根目录,然后在构建 jar 之后,我将该文件夹移动到与 jar 文件相同的位置。
    它的工作原理

    【讨论】:

    • 仅当该位置是调用 JAR 文件时的当前工作目录时才有效。
    • 但这不是你所说的,它是你回答的一个重要条件。
    • ......在构建 jar 之后,我将该文件夹移动到与 jar 文件相同的位置
    • 当前工作目录与 JAR 文件的位置不同。
    • no 在使用 netbeans 的开发模式下,您将资源放在 *当前工作目录 * 在生产模式下,您将其移动到 jar 位置。
    猜你喜欢
    • 1970-01-01
    • 2017-05-05
    • 2011-04-25
    • 2018-12-31
    • 2010-09-24
    • 2015-11-06
    • 2015-07-28
    相关资源
    最近更新 更多