获取 Java JAR 文件中资源的路径

1、简介

在 Java 中,通常使用相对于 JAR 文件根目录的路径来访问JAR文件中的资源。

本文将带你了解获取 Java JAR 文件中资源路径的不同方法。

2、使用 Class.getResource() 方法获取资源的 URL

Class.getResource() 方法提供了一种获取 JAR 文件中资源 URL 的直接方法。

该方法使用如下:

@Test
public void givenFile_whenClassUsed_thenGetResourcePath() {
    URL resourceUrl = GetPathToResourceUnitTest.class.getResource("/myFile.txt");
    assertNotNull(resourceUrl);
}

如上,调用 GetPathToResourceUnitTest.class 上的 getResource() 方法,并将资源文件路径 "/myFile.txt" 作为参数传递进去。然后,断言获取的 resourceUrl 不为 null,表示成功定位到资源文件。

3、使用 ClassLoader.getResource() 方法

还可以使用 ClassLoader.getResource() 方法访问 JAR 文件中的资源。在编译时不知道资源路径的情况下,该方法非常有用:

@Test
public void givenFile_whenClassLoaderUsed_thenGetResourcePath() {
    URL resourceUrl = GetPathToResourceUnitTest.class.getClassLoader().getResource("myFile.txt");
    assertNotNull(resourceUrl);
}

如上,使用类加载器 GetPathToResourceUnitTest.class.getClassLoader() 来获取资源文件。与前一种方法不同,该方法不依赖于类的包结构,它会在类路径的根级别搜索资源文件。

这意味着,无论资源位于项目结构中的哪个位置,它都能找到资源,从而更灵活地访问位于类包之外的资源。

4、Class.getResource() 和 ClassLoader.getResource() 的区别

Java 中的 Class.getResource()ClassLoader.getResource() 是用于访问资源的两种不同方法。它们之间的区别在于 资源路径的解析方式起始位置 的不同。

Class.getResource() 是一个实例方法,它是通过调用特定类的实例来访问资源的。资源路径是相对于当前类的位置进行解析的。它会从与类文件相同的包中查找资源。例如,如果使用 this.getClass().getResource("/myFile.txt"),它将在与当前类相同的包中查找名为 "myFile.txt" 的资源。

ClassLoader.getResource() 是一个静态方法,它是通过类加载器(ClassLoader)来访问资源的。资源路径是相对于类加载器的起始位置进行解析的。它可以从类路径中的任何位置查找资源。例如,使用 ClassLoader.getResource("myFile.txt") 将在类路径(classpath)中搜索名为"myFile.txt" 的资源。

总结来说,Class.getResource() 适用于相对于当前类的包位置的资源访问,而 ClassLoader.getResource() 适用于类路径中(classpath)的任意位置的资源访问。

5、使用 Paths.get() 方法

从 Java 7 开始,可以使用 Paths.get() 方法获取表示 JAR 文件中资源的 Path 对象。如下

@Test
public void givenFile_whenPathUsed_thenGetResourcePath() throws Exception {
    Path resourcePath = Paths.get(Objects.requireNonNull(GetPathToResourceUnitTest.class.getResource("/myFile.txt")).toURI());
    assertNotNull(resourcePath);
}

如上首先调用 getResource() 方法获取资源文件的 URL。然后,将 URL 转换为 URI,并将其传递给 Paths.get(),以获得代表资源文件位置的 Path 对象。

当我们需要将资源文件作为 Path 对象处理时,这种方法非常有用。它可以实现更高级的文件操作,如读取或写入文件内容。此外,它还提供了一种在 Java NIO(非阻塞)包上下文中与资源交互的便捷方法。

6、总结

本文介绍了 Java 运行时从 JAR 文件中获取资源的方法,其中 Class.getResource() 方法最简单,ClassLoader.getResource() 方法更灵活,而 JDK 7 中的 Paths.get() 方法则比较现代化。


Ref:https://www.baeldung.com/java-get-path-resource-jar