Java ClassLoader

概述 不同 JVM 实现细节各异,下文只讨论 HotSpot 在 JDK 9 及以后(含当前 JDK 26)的行为。JDK 8 及更早的 ExtClassLoader、jre/lib/ext、sun.misc.Launcher 等表述见文末「JDK 8 及更早」。 本文从四方面展开:内置 ClassLoader 层次、双亲委托、自定义 ClassLoader、打破双亲委托的常见场景。类加载器「去哪里找类」由 classpath / module path 决定,概念见 Java Classpath 与 Module Path。 内置 ClassLoader 层次 JDK 运行时提供三个内置加载器(ClassLoader 官方文档): 加载器 获取方式 职责 Bootstrap Java 代码中为 null 加载 java.base 等核心模块;C++ 实现,不是 ClassLoader 子类 Platform(原 Extension) ClassLoader.getPlatformClassLoader() 加载 Java SE 平台 API 及其模块(非应用 classpath) System / Application ClassLoader.getSystemClassLoader() 加载应用 classpath、module path 上的类 父子关系: Bootstrap (null) └── PlatformClassLoader └── AppClassLoader (System ClassLoader) 实现类位于 jdk.internal.loader.ClassLoaders(PlatformClassLoader、AppClassLoader),均为内部 BuiltinClassLoader 体系。不要依赖具体类名写业务逻辑。 ...

Created 9096-09-09 · Updated 28286-06-28 · 3 min · 550 words · -

java -cp / -classpath

作用 -cp 与 -classpath 等价,用来指定运行时查找类和 JAR 的 classpath(类路径)。classpath 的概念、与依赖管理工具和 module path 的关系,见 Java Classpath 与 Module Path。 语法 java -cp <类路径> <主类全限定名> [应用参数...] 条目之间的分隔符:Linux/macOS 用冒号 :,Windows 用分号 ; 条目可以是目录或 JAR/ZIP 文件 . 代表当前目录 支持通配符 lib/*(匹配目录下所有 JAR,不递归子目录),但不能写 lib/*.jar 一旦显式指定 -cp,默认的当前目录 . 不再自动加入,需要时要显式写上 示例 # 当前目录 + 一个 jar(Linux/macOS) java -cp .:lib/hsqldb.jar org.hsqldb.Server -database mydb # Windows 用分号分隔 java -cp .;lib\hsqldb.jar org.hsqldb.Server -database mydb # 用通配符引入一个目录下所有 jar java -cp "app.jar:lib/*" com.example.Main 现在大多用 Maven/Gradle 或 IDE 自动拼装 classpath,手写 -cp 多见于命令行手动编译运行、排查问题等场景。 ...

Created 17176-04-17 · Updated 28286-06-28 · 1 min · 87 words · -

Java ClassLoader (merged into classloader)

本文已合并 这篇 2012 年的转载内容(基于 JDK 8 的 ExtClassLoader、sun.misc.Launcher、jre/lib/ext 等)已过时,相关内容已并入并按 JDK 9+ / 当前 HotSpot 重写: 类加载器层次、双亲委托、自定义 ClassLoader、打破双亲委托:见 Java ClassLoader classpath / module path 概念:见 Java Classpath 与 Module Path 本页仅作旧链接(/p4316/、java-classloader-2)重定向占位保留。 维护记录 时间 修改内容 原因 2026-06-28 退役为重定向占位,正文并入 classloader.md;新增 classpath 概念链到 classpath.md;分类 Java→language,删除 reprint 与现行 HotSpot 不符、与 classloader.md 高度重复

Created 26266-09-26 · Updated 28286-06-28 · 1 min · 47 words · lcf

Java Classpath 与 Module Path

Classpath 是什么 Classpath(类路径) 是 JVM 在运行时查找 .class 文件和 JAR 包的搜索路径集合。当代码里出现 new Foo() 或 Foo.class 时,类加载器要把 com.example.Foo 这个名字解析成磁盘上的 com/example/Foo.class 字节码,去哪里找,就由 classpath 决定。 可以把它理解成「类的 PATH 环境变量」:shell 的 PATH 决定 ls、git 这些命令去哪些目录找可执行文件;JVM 的 classpath 决定加载类时去哪些目录和 JAR 里找字节码。 一条 classpath 由多个条目组成,每个条目是一个目录或一个 JAR/ZIP 文件: 目录条目:以该目录为根,按包名展开找 .class(如条目 target/classes + 类 com.foo.Bar → 找 target/classes/com/foo/Bar.class) JAR 条目:把 JAR 当成一个打包的目录,在其中按同样规则找 分隔符与操作系统有关:Linux/macOS 用冒号 :,Windows 用分号 ;。 如何设置 classpath 按优先级从高到低,常见几种方式: 方式 写法 说明 -cp / -classpath java -cp app.jar:lib/* com.foo.Main 命令行显式指定,最常用;详见 java -cp CLASSPATH 环境变量 export CLASSPATH=... 全局生效,易污染,现代项目基本不用 可执行 JAR 的 Class-Path MANIFEST.MF 里的 Class-Path: JAR 内清单声明依赖;见 MANIFEST.MF 默认值 不指定时为当前目录 . 仅在没有任何设置时 -cp 支持通配符 lib/*(匹配该目录下所有 JAR,但不递归子目录),但不能写成 lib/*.jar。指定了 -cp 后默认的当前目录 . 会失效,需要的话要显式写进去。 ...

Created 28286-06-28 · Updated 28286-06-28 · 2 min · 295 words · -