V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
matepi
V2EX  ›  Java

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

  •  
  •   matepi · 2020-03-20 10:29:25 +08:00 · 2579 次点击
    这是一个创建于 1717 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不能修改 jar

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

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

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

    9 条回复    2020-03-23 10:30:25 +08:00
    zhxjdwh
        1
    zhxjdwh  
       2020-03-20 10:39:03 +08:00 via Android
    -cp 文件顺序 貌似可以控制
    wangsongyan
        2
    wangsongyan  
       2020-03-20 10:49:00 +08:00
    改下 jar 包名,B 字典序排在前面,以前搞过一次,不过这种方式不科学
    littlewing
        3
    littlewing  
       2020-03-20 10:52:27 +08:00
    包名不一样也能被覆盖?
    lff0305
        4
    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
        5
    pursuer  
       2020-03-20 14:32:50 +08:00
    我觉得使用自定义 classloader 是最佳方案。类替换本就是类加载器处理的工作
    changdy
        6
    changdy  
       2020-03-20 14:59:58 +08:00
    好巧不巧 , 我也遇到了这个问题...直接覆盖了某 dee jar 包中的一个 class ,增加了一些日志输出,结果生效了...

    PS 某 dee 公司的业务员水平之差简直让我瞠目结舌, 服务器爆出 500 , 请求对方审查下自己的服务器. 结果一直和我东扯 西扯.
    hantsy
        7
    hantsy  
       2020-03-20 15:10:12 +08:00
    maven shade plugin.
    hantsy
        8
    hantsy  
       2020-03-20 15:11:31 +08:00
    @pursuer OSGI 才是正确方案,每个 Module 都是独立的 Classloader,互不干扰。
    lewis89
        9
    lewis89  
       2020-03-23 10:30:25 +08:00
    @hantsy #8 BeanFactory 好像可以修改为自定义 ClassLoader ,这样的话 你可以自己多建几个 Spring 的上下文 分开来就好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1005 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:56 · PVG 06:56 · LAX 14:56 · JFK 17:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.