Java获取资源(getResource的方式)的搜寻顺序是:首先是Bootstrap加载的jar包,然后是扩展加载的jar包,最后是我们自己配置的classpath。这个具体步骤就不详细说明了,如有需要请参考查找Classes的官方文档。
在实际项目中前两个步骤一般我们不太关心。更多的是需要配置和查找资源文件,如果了解一些关于classpath的知识,就能更准确的找到资源文件。
这里总结一些基本的信息:
1. 获取classpath
一般来说,可以通过System.getProperty("java.class.path")来获取classpath。
但是有一种情况并不适用,如果程序以jar包方式运行,这样获取的classpath就只有一个,就是运行的jar包文件。但其实classpath并不只有这一个jar包,这只是一个入口jar,真正的classpath还包括该jar包的META-INF/MANIFEST.MF文件中的“Class-Path: ”项。因此该方法并不完全适用。
2. classpath的父路径
获取到的classpath并不能确定是绝对路径还是相对路径,取决于配置写的是绝对还是相对路径,获取的时候并不会自动转换为绝对路径。因此需要确定如何得到父路径。
- 以非jar包运行,此时classpath的父路径是工作目录,取自System.getProperty("user.dir")。
- 以jar包运行,该jar包配置的“Class-Path: ”的父路径是该jar包所在目录。
3. 配置classpath
如同上面所说,是否是以jar包运行,classpath的情况的不同的,配置方式也有所差异。配置classpath是为了能够找到class文件(包括jar包中)及资源文件,如果配置目录并不会查找目录下的所有jar包,因此凡是在jar包中的资源需要配置jar包。
- 以非jar包运行,那么就可以使用java的 -cp 或 -classpath 进行配置,后面跟随的是目录或jar文件,并且支持*通配符匹配多个jar文件,多个classpath以系统路径分隔符进行分隔(通过System.getProperty("path.separator")获得,windows是";",linux是":")。
- 以jar包运行,使用-cp/-classpath是无效的,必须在META-INF/MANIFEST.MF文件中配置“Class-Path: ”项,包括目录或jar文件,这里并不支持*通配符匹配多个jar文件,需要一一配置,多个classpath以空格分隔。
4. classpath查找顺序
遍历classpath的顺序与配置的classpath的顺序完全一致。如果是以jar包运行,因为入口是jar包,在System中获取的classpath也是该jar包,因此会先在该jar包中查找,然后再按顺序遍历查找MANIFEST.MF文件中“Class-Path: ”的配置。
由以上特点总结,在配置、或查找资源时,需要注意运行方式。如果以jar包方式运行,而需要读取jar包外的资源,就需要把资源所在的路径(相对路径是相对于jar包所在目录)配置到MANIFEST.MF文件中。
有的时候编写可执行jar包项目,需要获取配置文件,此时,我们其实更希望是这样一种查找顺序:先找文件系统中的配置文件,如果存在,则使用该配置文件,如果不存在,则使用打包在jar中的配置。因为打包时为了使用方便,可以把默认配置放在jar包中,但是如果要自定义配置,一般并不会直接修改jar包中的文件,而是需要将配置放在文件系统中,方便修改。所以一般来说,文件系统的classpath应当优先于jar包进行查找。
之前提供的resource-utils库自0.0.5版本开始,提供支持这种配置查找顺序,方便使用配置文件。
相关推荐
在Java开发中,经常会遇到需要获取文件路径的情况,尤其是在处理配置文件、图片等资源时。本文将详细介绍Java中获取文件路径的各种方法及其应用场景,帮助开发者更好地理解和掌握这些技巧。 #### 二、基本概念 在...
Spring Boot加载资源路径配置和Classpath问题解决 ...Spring Boot加载资源路径配置和Classpath问题解决是Java应用程序中的一个重要概念。理解Classpath的概念和工作原理对于解决资源加载问题和Classpath问题非常重要。
Java中使用的路径主要分为绝对路径和相对路径两种,其中绝对路径又细分为URI形式的绝对资源路径和本地系统的绝对路径。相对路径则包括相对于classpath的相对路径和相对于当前用户目录的相对路径。 - **URI形式的...
本文将深入探讨Java路径解决方案,旨在帮助开发者理解和解决与此相关的各种问题。 首先,我们来了解一下Java中的类路径(Classpath)。类路径是Java虚拟机(JVM)寻找类文件的路径集合,它决定了哪些目录和.jar文件...
### Java中File的相对路径与绝对路径总结 在Java Web开发过程中,经常需要处理文件的读写操作,尤其是在运行时获取配置文件、动态加载对象等情况。对于这些需求,理解和掌握文件的相对路径与绝对路径至关重要。 ##...
1. **URI形式的绝对资源路径**:例如 `file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b`。URL是URI的一个特例。URL通常用于访问网络资源,其前缀(即协议部分)必须是Java能够识别的。而URI则更多地用于表示...
- **定义**:`classpath`是Java虚拟机(JVM)用来查找用户自定义类和资源的路径集合。 - **作用**:当Java程序运行时,JVM会根据`classpath`来定位所需的类文件(`.class`文件)和其他资源文件。如果没有正确配置`...
Classpath 是 Java 环境中一个非常重要的概念,它告诉 JVM(Java 虚拟机)去哪里寻找用户定义的类和资源。 1. **Classpath 的作用**: - 指明 Java 类文件的搜索路径,包括可执行 JAR 文件和目录等。 - Java 应用...
在Java编程环境中,`Classpath`(类路径)是一个至关重要的概念,它是Java虚拟机(JVM)查找和加载.class文件的路径。当我们在开发和运行Java程序时,正确配置Classpath是确保程序能正常运行的关键步骤。这篇文档将...
- `java.net.URI`类是通用的统一资源标识符,可以用来处理各种类型的资源路径,包括本地文件和网络资源。 7. 应用程序上下文路径 - 在Web应用中,`ServletContext`的`getContextPath()`方法返回应用程序的上下文...
在Java编程语言中,了解如何获取类路径(classpath)是至关重要的,因为类路径决定了Java虚拟机(JVM)在运行时如何查找和加载类。本文将详细介绍在Java中获取类路径的几种常见方法,以供开发者参考。 首先,类路径...
它定义了Java虚拟机(JVM)在执行程序时查找类文件的路径,确保JVM能够找到所需的类库和资源。理解并正确设置classpath对于Java开发者至关重要,因为这直接影响到程序能否正常运行。 一、classpath的基本概念 ...
Java路径问题最终解决方案 —可定位所有资源的相对路径寻址 通过相对classpath路径实现自由寻找资源的助手类的源代码
例如,`file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b` 是一个URI形式的绝对资源路径,它表示了文件`aaa.b`在硬盘上的具体位置。而像`D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b`则是本地系统的...
这些方法可以帮助开发者构建所需的资源路径,特别是当需要访问位于`classpath`外部的资源时。 #### 五、结论 综上所述,Java中的路径问题虽然复杂,但通过采用最佳实践和利用提供的工具方法,可以有效地解决这些...
`Classpath`是指Java运行时查找用户自定义类或资源文件的路径列表。它告诉Java虚拟机(JVM)和Java编译器(javac)到哪些位置寻找非标准库中的类文件。在默认情况下,如果未指定`classpath`,JVM和javac会在当前目录...
在处理资源路径时,需要注意以下几点最佳实践: - 避免使用基于`System.getProperty("user.dir")`的相对路径,因为这可能会在不同环境下导致问题。 - 尽量使用URI形式的绝对路径,便于转换为URI、URL或File对象。 - ...
根据提供的部分代码示例,我们可以看到不同的方法调用方式以及它们对应的资源路径: 1. `this.getClass().getResource("")`:获取当前类所在的目录路径,如`file:/D/workspace/jbpmtest3/bin/com/test/`。 2. `this...