classpath 浅析

通常在自己编写代码解析指定的配置文件时,为了定位文件的路径会用到使用 Java 代码获取项目路径和 classpath 的情况。

Java 中获取 classpath

package org.company.demo;

import lombok.extern.slf4j.Slf4j;

import java.net.URL;

@Slf4j
public class ClassPathDemo {

    public static void main(String[] args) {
        // 获取当前项目工程路径
        String projectPath = System.getProperty("user.dir");
        System.out.println(projectPath); // F:\work\demo\codetest

        // 获取当前 classPath
        URL classPath = ClassPathDemo.class.getResource("/");
        System.out.println(classPath.toString()); // file:/F:/work/demo/codetest/target/classes/
        System.out.println(classPath.getPath()); // //F:/work/demo/codetest/target/classes/

        // 获取当前 classPath 等同上一行代码
        URL classPathByClassLoader = ClassPathDemo.class.getClassLoader().getResource("");
        System.out.println(classPathByClassLoader.toString()); // file:/F:/work/demo/codetest/target/classes/
        System.out.println(classPathByClassLoader.getPath()); // /F:/work/demo/codetest/target/classes/

        //获取当前类基于 classPath 的完整路径
        URL classFullPath = ClassPathDemo.class.getResource("");
        System.out.println(classFullPath); // file:/F:/work/demo/codetest/target/classes/org/company/demo/
        System.out.println(classFullPath.getPath()); // /F:/work/demo/codetest/target/classes/org/company/demo/
    }
}
项目结构

Spring 配置中的 classpath:classpath*: 的区别

  • classpath::表示从类路径中加载资源。classpath:classpath:/ 是等价的,都是相对于类的根路径。资源文件库标准的在文件系统中,也可以在 JARZIP 的类包中。
  • classpath*::假设多个 JAR 包或文件系统类路径都有一个相同的配置文件,classpath: 只会在第一个加载的类路径下查找,而 classpath*: 会扫描所有这些 JAR 包及类路径下出现的同名文件。

在多个 classpath 中存在同名资源,都需要加载时,那么用 classpath: 只会加载第一个,这种情况下也需要用 classpath*: 前缀。

参考

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容