Java 文件相对于类的位置

标签 java jakarta-ee classpath classloader ear

我很困惑 java 如何从类加载器的角度看待文件系统。

假设我在 EAR 的 APP-INF/lib 文件夹中有一个 jar 文件。该 jar 文件包含一个类,该类实例化 new File("foo.txt")。另外,foo.txt 位于 APP-INF/lib 文件夹中 jar 旁边。

然后,我在 WAR 模块中使用这个库。现在,代码是否仍然可以找到该文件,或者是否可以在 EAR 的根目录或 WAR 的根目录中找到该文件?

最佳答案

我非常确定该文件需要位于 WAR 的根目录中,因为 WAR 从 EAR 的 APP-INF/lib 加载到 jar 文件中,因此它将相对于 WAR 的文件路径进行搜索

这是如何在类路径中处理它的示例

package main;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

public class Test {

    private Test() {
        Class<?> c = this.getClass();
        ClassLoader cl = c.getClassLoader();
        InputStream[] iss = new InputStream[8];
        URL[] urls = new URL[8];
        iss[0] = c.getResourceAsStream("/resources/txtFile.txt");
        iss[1] = c.getResourceAsStream("resources/txtFile.txt");
        iss[2] = c.getResourceAsStream("/txtFile.txt");
        iss[3] = c.getResourceAsStream("txtFile.txt");
        iss[4] = cl.getResourceAsStream("/resources/txtFile.txt");
        iss[5] = cl.getResourceAsStream("resources/txtFile.txt");
        iss[6] = cl.getResourceAsStream("/txtFile.txt");
        iss[7] = cl.getResourceAsStream("txtFile.txt");
        urls[0] = c.getResource("/resources/txtFile.txt");
        urls[1] = c.getResource("resources/txtFile.txt");
        urls[2] = c.getResource("/txtFile.txt");
        urls[3] = c.getResource("txtFile.txt");
        urls[4] = cl.getResource("/resources/txtFile.txt");
        urls[5] = cl.getResource("resources/txtFile.txt");
        urls[6] = cl.getResource("/txtFile.txt");
        urls[7] = cl.getResource("txtFile.txt");
        for (int i = 0; i < 8; i++)
            System.out.println("iss[" + i + "] is "
                    + String.valueOf(iss[i] == null));
        for (int i = 0; i < 8; i++)
            System.out.println("url[" + i + "] is "
                    + String.valueOf(urls[i] == null));

    }

    public static final void main(String[] args) {
        new Test();
    }
}

打印

iss[0] is false
iss[1] is true
iss[2] is true
iss[3] is true
iss[4] is true
iss[5] is false
iss[6] is true
iss[7] is true
url[0] is false
url[1] is true
url[2] is true
url[3] is true
url[4] is true
url[5] is false
url[6] is true
url[7] is true

关于Java 文件相对于类的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46579522/

相关文章:

java - 一个应用程序中的两个单例 - 都具有不同的 @Scheduled 方法 - 一个类方法等待另一个?

java - weblogic服务器发布失败

java - 是否可以有 2 个子线程,每个子线程具有不同的类路径?

java - 在 Java 中更改引用

java - 可选参数 jpa 2.1

java - 如何计算排列中的交换次数?

java - 将 EJB 从 2.1 更改为 3.0

java - Hibernate 映射文件的替代位置?

java - 如何在 Equinox 中定义类路径目录?

java - 如果 WHERE 得到空结果,则抛出 UPDATE 查询异常