生产环境 class临时替换方案

场景使用:  生成上已有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包中的类]

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容