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

询问一下 Java 如何兼容同 jar 两个版本

  •  1
     
  •   pkwenda ·
    pkwenda · 2020-07-31 17:38:24 +08:00 · 2405 次点击
    这是一个创建于 1336 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在正在迁移 es 2.x 到 7.x

    公司内部自己实现了一些:迁移、修改、flyway 等方式,所以 参考了 spring-data-elasticSearch 改了改做了下兼容

    现在需要维持两个 dataSource 一个 是原来使用的 es 官方 2.x 的 elasticSearch,一个是 现在官方推荐的 7.4.2 的 high-level-rest-template 两个 maven jar


    目前需要查询老数据,老 pojo 做一些转换,已经实现了,两个 jar 冲突,high-level-rest-template 有一些 ClassNotFound 原因也是因为冲突,新旧两个包( ES 估计也没想到有人会这么用,没用他们推荐的升级方式)

    因为落后的版本越多,升级问题也就越多


    现在是自己写的 ClassLoader 来实现的,不过要指定 jar 包,

    ```
    -Dzing.loader.path=/Users/xxx/xxx/lib

    ```

    虽然实现了,但是不优雅,开发、部署 很不方便

    请问有其他方式、技术、或者 maven 插件 能做到这一点吗?
    8 条回复    2021-03-22 23:28:21 +08:00
    izhangzhihao
        1
    izhangzhihao  
       2020-07-31 17:40:37 +08:00
    maven shade plugin
    cco
        2
    cco  
       2020-07-31 17:56:24 +08:00
    1 楼的办法可以尝试,我最近也刚升级到 7.8,不过我直接丢弃了低版本的东西。
    pkwenda
        3
    pkwenda  
    OP
       2020-07-31 18:15:52 +08:00
    @izhangzhihao #1
    @cco #2

    maven shade plugin 小弟昨天在 elastic 社区看到了,貌似他解决的是:比如 es 引用了 guava,与自己的 guava 冲突,可以抛弃 es 的 guava 用自己的。可以搞定版本共存的问题吗?我还简单跑了一下。
    pkwenda
        4
    pkwenda  
    OP
       2020-07-31 18:24:28 +08:00
    Umenezumi
        5
    Umenezumi  
       2020-07-31 18:50:24 +08:00   ❤️ 1
    up
    SoloCompany
        6
    SoloCompany  
       2020-07-31 18:59:15 +08:00 via iPhone
    可以把旧版本的 jar 打包到 META-INF 然后自己写 classloder,避免须以手工处理执行命令参数依赖的问题
    daiwenzh5
        7
    daiwenzh5  
       2021-03-22 23:20:39 +08:00
    @SoloCompany 我今天也遇到相同的需求了,使用 shade 并不能很好的解决,使用的是 jarjar.jar 。但是它具体怎么实现的,我并没有看源码,相比较而言,前两个是黑盒操作,没有类加载器清晰,但是类加载器通过反射执行,如果需要显式的声明其中的对象怎么办?比如 SDK 中的 xxxRequest 对象,和 xxxResponse 对象。具体该怎么操作呢?
    SoloCompany
        8
    SoloCompany  
       2021-03-22 23:28:21 +08:00
    @daiwenzh5 #7 所有依赖到特殊版本的代码, 如果 API 兼容, 那么只需使用同样的 ClassLoader load 就能实现封装, 如果 API 不兼容, 那么依赖的代码要和特殊版本的 lib 一起编译然后再通过别的 API 把业务逻辑暴露出来给上层调用, 当然也可以选择不封装那就只能使用反射的方式
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4154 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:01 · PVG 09:01 · LAX 18:01 · JFK 21:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.