来源资料:https://docs.oracle.com/javase/tutorial/ext/basics/install.html
拓展例子:https://gitee.com/longguiyunjosh/java-spi/tree/master/
偶尔看到的资料,深怕过了一段时间就忘记了。随便就写了一下。
在我们打包jar工程的时候,往往都有很多依赖第三方的jar包。常用的maven构建工具,在我们打jar包的时候,需要把依赖的jar包打到固定的文件夹下。
然后jar包里的METE-INF文件夹下的MANIFEST.MF文件会中有 CLASS-PATH会有依赖的jar包配置,多个依赖用空格分开。
Manifest-Version: 1.0
Built-By: xx
Class-Path: lib/DemoC-1.0-SNAPSHOT.jar lib/DemoB-1.0-SNAPSHOT.jar
Created-By: Apache Maven 3.5.3
Build-Jdk: 1.8.0_171
Main-Class: com.amzing.jar.DemoA
如果没有指定Class-Path的话,我们可以把依赖的jar包放入jre中的lib/ext中去,jvm会直接加载我们需要的jar包。
可以通过配置 -verbose:class查看jvm加载了那些class。
下面可以发现DemoC实在jre/lib/ext中的文件夹下
[Loaded java.lang.Void from D:\develop_tool\Java\jdk1.8.0_171\jre\lib\rt.jar]
[Loaded com.amzing.jar.A from file:/D:/work/temp_code/jar-install/DemoA/target/DemoA-1.0-SNAPSHOT.jar]
[Loaded com.amzing.jar.C from file:/D:/develop_tool/Java/jdk1.8.0_171/jre/lib/ext/DemoC-1.0-SNAPSHOT.jar]
我们直接指定jar文件,可以直接调用到依赖的jar包
PS D:\work\temp_code\jar-install\DemoA\target> java -jar .\DemoA-1.0-SNAPSHOT.jar
I am Class A.
I am class C.
到此结束。。。