在不修改 A.jar 包的情况下,使 A.jar 包内某个 C.class,必定被另一个 B.jar 包中的 C.class 所覆盖,如何达成?

2020-03-20 10:29:25 +08:00
 matepi

不能修改 jar

也不考虑在主项目的 src 源码代码路径中加入此 class 的源码

是不是得必须搞自定义的 classloader 了?但如果也不想主项目中加入特别的代码、包括自动以 classloader 的话,如何做到呢?

是不是只有在装载 B.jar 的某个 A.jar 中没有的类时,并确保在 B.jar 相关功能起效前,把 classloader 已经装载进来的 A.jar 的 C.class 卸载掉,然后自定义装载 B.jar 的 C.class?

2387 次点击
所在节点    Java
9 条回复
zhxjdwh
2020-03-20 10:39:03 +08:00
-cp 文件顺序 貌似可以控制
wangsongyan
2020-03-20 10:49:00 +08:00
改下 jar 包名,B 字典序排在前面,以前搞过一次,不过这种方式不科学
littlewing
2020-03-20 10:52:27 +08:00
包名不一样也能被覆盖?
lff0305
2020-03-20 11:25:42 +08:00
试试 -Xbootclasspath 或者把 b.jar 放到 java.ext.dirs
或者用取巧的办法? 启动脚本把 a.jar copy 一个 a1.jar, 删除里面的 C.class, 后面脚本里都用 a1.jar
pursuer
2020-03-20 14:32:50 +08:00
我觉得使用自定义 classloader 是最佳方案。类替换本就是类加载器处理的工作
changdy
2020-03-20 14:59:58 +08:00
好巧不巧 , 我也遇到了这个问题...直接覆盖了某 dee jar 包中的一个 class ,增加了一些日志输出,结果生效了...

PS 某 dee 公司的业务员水平之差简直让我瞠目结舌, 服务器爆出 500 , 请求对方审查下自己的服务器. 结果一直和我东扯 西扯.
hantsy
2020-03-20 15:10:12 +08:00
maven shade plugin.
hantsy
2020-03-20 15:11:31 +08:00
@pursuer OSGI 才是正确方案,每个 Module 都是独立的 Classloader,互不干扰。
lewis89
2020-03-23 10:30:25 +08:00
@hantsy #8 BeanFactory 好像可以修改为自定义 ClassLoader ,这样的话 你可以自己多建几个 Spring 的上下文 分开来就好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/654481

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX