场景使用: 生成上已有jar包服务,需要替换掉其中的几个类,而不影响其服务jar
搞一个jar包,放到指定目录下,配置上之后,可以用来替换掉 已有启动服务中的类,而不用去动启动服务
1. -cp 可以指定额外的jar(-cp不支持文件夹的方式,且与-jar冲突) 属于用户类加载器加载 [不用]
当使用-jar参数运行的时候,java VM会屏蔽所有的外部classpath,而只以本身yourJarExe.jar的内部class作为类的寻找范围。
也可以在jar包里修改 修改Manifest 文件
在Manifest.mf文件里加入如下行
Class-Path:classes12.jar lib/thirdlib.jar
2.{java.ext.dirs} 可选包扩展机制 扩展类加载器 加载路径 [可用]
--Djava.ext.dirs 方式会会有一个问题,就是会覆盖默认的ext值 : $JAVA_HOME/jre/lib/ext
eg: -Djava.ext.dirs= a/b/c:$JAVA_HOME/jre/lib/ext windows 下用分号隔开
3. 改动启动类加载器的路径
(1)-Xbootclasspath: 分隔目录和zip/jar文件。设置搜索路径以引导类和资源。分隔符unix使用:号,windows使用;
注意,如果用这个参数,不用下面的/a或者/p的话,就只会从这里指定的目录和文件里加载了,就不会到${java_home}\jre\lib下加载核心类库了
(2)-Xbootclasspath/a: 后缀在核心class搜索路径后面。unix使用:号,windows使用来分隔目录和zip/jar文件 [常用]
(3)-Xbootclasspath/p: 前缀在核心class搜索路径前面.不常用。
4.{java.endorsed.dirs} 包升级替换机制 [可用]
-Djava.endorsed.dirs=
或者将jar放到 $JAVA_HOME/jre/lib/endorsed
-Djava.endorsed.dirs指定的目录面放置的jar文件,将有覆盖系统API的功能;
可以牵强的理解为,将自己修改后的API打入到JVM指定的启动API中,取而代之。但是能够覆盖的类是有限制的,其中[不包括java.lang包中的类]