Classpath
可以使用 classpath 指定类加载的路径,但 classpath 的生效是有条件的:
命令 | classpath 生效 | 说明 |
---|---|---|
java -cp .;lib/x.jar Test | ✔ | 运行 class |
java -cp lib/x.jar -jar app.jar | ✖ | 运行 jar |
Loader.path
Spring Boot 程序大多是打成 jar 包,使用 java -jar boot.jar
的方式启动 (此时 -cp 无效),可以使用 loader.path 指定类加载路径加载其他 jar,但 loader.path 生效是有条件的:
命令 | MANIFEST.MF 的 Main-Class | loader.path 生效 | 打包配置 |
---|---|---|---|
java -Dloader.path=./lib -jar app.jar | JarLauncher | ✖ | 默认配置 |
java -Dloader.path=./lib -jar app.jar | PropertiesLauncher | ✔ | 额外配置 |
loader.path 实现了 classpath 的功能。
配置 Main-Class
为了使用 loader.path,需要把 jar 包的 Main-Class 配置为 PropertiesLauncher,在 build.gradle 中如下配置,可参考 Using the PropertiesLauncher:
1 | bootJar { |
LaunchedURLClassLoader
无论启动类是 JarLauncher 或者 PropertiesLauncher,loader.path 引入的 jar 和 Spring Boot 中 lib/*.jar 都是使用类加载器 org.springframework.boot.loader.LaunchedURLClassLoader 进行加载,也即是说他们使用的是同一个类加载器。
注意到同一个程序,打包成不同类型时,PropertiesLauncher (20s) 比 JarLauncher (8s) 启动慢很多。