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

2020-07-31 17:38:24 +08:00
 pkwenda
现在正在迁移 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 插件 能做到这一点吗?
2535 次点击
所在节点    Java
8 条回复
izhangzhihao
2020-07-31 17:40:37 +08:00
maven shade plugin
cco
2020-07-31 17:56:24 +08:00
1 楼的办法可以尝试,我最近也刚升级到 7.8,不过我直接丢弃了低版本的东西。
pkwenda
2020-07-31 18:15:52 +08:00
@izhangzhihao #1
@cco #2

maven shade plugin 小弟昨天在 elastic 社区看到了,貌似他解决的是:比如 es 引用了 guava,与自己的 guava 冲突,可以抛弃 es 的 guava 用自己的。可以搞定版本共存的问题吗?我还简单跑了一下。
pkwenda
2020-07-31 18:24:28 +08:00
Umenezumi
2020-07-31 18:50:24 +08:00
up
SoloCompany
2020-07-31 18:59:15 +08:00
可以把旧版本的 jar 打包到 META-INF 然后自己写 classloder,避免须以手工处理执行命令参数依赖的问题
daiwenzh5
2021-03-22 23:20:39 +08:00
@SoloCompany 我今天也遇到相同的需求了,使用 shade 并不能很好的解决,使用的是 jarjar.jar 。但是它具体怎么实现的,我并没有看源码,相比较而言,前两个是黑盒操作,没有类加载器清晰,但是类加载器通过反射执行,如果需要显式的声明其中的对象怎么办?比如 SDK 中的 xxxRequest 对象,和 xxxResponse 对象。具体该怎么操作呢?
SoloCompany
2021-03-22 23:28:21 +08:00
@daiwenzh5 #7 所有依赖到特殊版本的代码, 如果 API 兼容, 那么只需使用同样的 ClassLoader load 就能实现封装, 如果 API 不兼容, 那么依赖的代码要和特殊版本的 lib 一起编译然后再通过别的 API 把业务逻辑暴露出来给上层调用, 当然也可以选择不封装那就只能使用反射的方式

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

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

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

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

© 2021 V2EX