以在 Test.java 中加载 app-1.jar 和 app-2.jar 中的类 com.xtuer.Aloha 为例演示 classpath 中 jar 被加载的顺序。
app-1.jar 和 app-2.jar
创建项目,里面只有 1 个类 com.xtuer.Aloha,分别打包成 2 个版本的 jar 包:
- app-1.jar: 返回 Aloha-1
- app-2.jar: 返回 Aloha-2
1 | package com.xtuer; |
项目的目录结构 (此 gradle 管理的 Java 项目结构仅作为参考):
1 | app |
测试项目
项目的目录结构:
1 | jar-test |
测试类 Test:
1 | public class Test { |
测试用例
结论: 在 classpath 中,即使有多个路径完全相同的类也没问题,JVM 只会加载最先找到的类,忽略其他同名的类:
运行 Test 时,在 classpath 中加载 app-1.jar 和 app-2.jar,使用了 2 种加载方式:
- jar 包各自的路径
- 通配符 * 选中所有 jar
jar 包各自的路径:
1 | D:\temp\jar-test>java -cp .;lib/app-1.jar Test |
通配符 * 选中所有 jar:
1 | jar 包的名字不变 |
提示:
- 使用
*
,不能使用*.jar
- 使用
lib/*
只能查找 lib 目录下的 jar,不能递归查找 lib 子目录下的 jar- 使用
lib/*
时,哪个 jar 排在前面由系统对文件排序决定