gpt4 book ai didi

java - 当应用程序部署为 JAR 时,为什么 ".."(两个句点)不能上升到一个目录?

转载 作者:行者123 更新时间:2023-11-30 06:45:02 25 4
gpt4 key购买 nike

当我在 IDE 中运行应用程序时,accessing the parent directory (相对于当前目录)使用..(两个句点)很容易完成。

这是一个简单的例子:

包结构

src
└───main
├───java
│ │ Main.java
│ │
│ └───controllers
│ Controller.java
│ InnerController.java

└───resources
└───fxml
inner-layout.fxml
layout.fxml

Controller 内部,我试着说,“向上一层然后找到 fxml/inner-layout.fxml”。

URL relativeResource = Controller.class.getResource("../fxml/inner-layout.fxml");
// Returns: "file:/C:/Users/BradTurek/IdeaProjects/Parent%20Directory%20Jar%20MCVE/build/resources/main/fxml/inner-layout.fxml"

这适用于文件系统。

但是,当我将应用程序部署为可执行的 .jar 文件时,.. 不再被解释为“向上一个目录”。我检查过:我仍然可以访问 .jar 中的资源——除非我使用包含 .. 的路径。

似乎 .. 在处理 .jar 内部的路径时不起作用。

这是 a full MCVE of the above example您可以自己下载并运行。

这个问题的答案不是容易在互联网上找到的——尽管它可能就在那里。我希望我已经足够清楚地提出这个问题,以便其他人可以轻松找到答案。

为什么会这样?

最佳答案

首先,就是说,方法Class.getResource(String)不指定任何支持处理路径中的“..”。因此,您的问题的答案可以在这里结束:“因为规范没有定义这种行为”

当应用程序从 IDE 内部启动时它起作用的原因是,在这种情况下,本地文件系统工具用于访问资源。这些能够解决您路径中的“..”。

但 JAR 文件本身并不是文件系统 - 它只是一个压缩容器,以未定义的顺序保存所有 .class 文件和其他资源(参见 JAR file specification - Oracle )。虽然它符合 ZIP 文件标准,在其末尾包含一个目录列表,称为“中央目录”(参见 ZIP (file format) - Wikipedia),但必须首先使用此列表来构建树状可导航路径结构,在它可以用于解析路径之前。我假设由于性能和内存消耗的原因,这不是通过类加载器加载类和其他资源。

但在您的情况下,实际上根本没有理由使用相对路径,因此依赖于路径解析。相反,您可以使用绝对路径。这听起来更糟,因为这样的绝对路径在您的文件系统意义上并不是真正的绝对路径,而是相对于您的类路径根目录而言的绝对路径!

所以这应该可行:

URL resource = Controller.class.getResource("/fxml/inner-layout.fxml");

不管资源是从您的文件系统、JAR 文件还是通过 HTTP 从远程存储服务器加载的,都没有关系。

关于java - 当应用程序部署为 JAR 时,为什么 ".."(两个句点)不能上升到一个目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49745159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com