获取 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