活久见 。org.jboss.netty 和 io.netty 你分的清吗?

大家好,我是小猿来也,一个热衷写 bug 的程序猿。

一天我正在专心致志写 Bug 的时候,一个同事跑过来找我。

说有个很特别三方依赖库的 jar 包,里面有一些 netty 的依赖,但是无法确定 netty 的具体版本,让我帮忙给看看。

还有这事儿?

于是就让他把 jar 发来看看,收到后我就赶紧给它解压了,它的目录结构是下面这样的:

原来某宝、某钉的 SDK 就长这样?

大厂的SDK就这?

当时我就

这完全不按套路出牌呀,pom 文件哪里去了呢?gradle 文件哪里去了?这是什么黑科技呢?

盯着这个 jar 包解压之后的文件目录,翻来覆去好几遍,也没发现相关依赖库的坐标声明文件。

于是就问问同事有没有源文件,他说有,麻溜的发了过来,比平时喊他吃饭都快。

我打开一看,依然啥都没有。

顿时觉得这个类库有点不一样!

没有依赖库的坐标,怎么确定依赖库的版本呢?

同事那边还在催,只能先把这个类库为什么没有依赖库的坐标这个点放一放。

然后就先用一个一个版本尝试的方法来先帮他确定依赖的 netty 版本。

我随便打开了一个文件,发现里面有很多org.jboss.netty的依赖。



然后我就打开了 Maven 的中央仓库:https://mvnrepository.com 输入了netty关键字进行搜索。



搜索结果前面很多都是io.netty的信息,到了第7个才是org.jboss.netty的信息,就是我上图中圈出来的那个。

然后我就点了进去:https://mvnrepository.com/artifact/org.jboss.netty/netty



发现里面提供的主要是 Netty3.0.x3.1.x3.2.x的版本。

基于常识项目里引用 Netty 基本上都会引用Final的版本,所以我就在这个类库的源文件中加了一个 pom 文件,先拿3.2.10.Final这个版本试了下。

<!-- https://mvnrepository.com/artifact/org.jboss.netty/netty -->
<dependency>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
<version>3.2.10.Final</version>
</dependency>

添加完上面的依赖坐标信息后,尝试编译源代码,发现缺少org.jboss.netty.handler.codec.http.websocketx包。

然后分别试了3.1.5.GA缺少org.jboss.netty.handler.codec.http.websocketx包,3.0.0.GA缺少org.jboss.netty.handler.codec.http包。

也就是说3.0.x3.1.x3.2.x这个三个系列的版本里没有合适的。

不死心的我又搜了一下整个中央仓库里,也没能查到更多的关于org.jboss.netty的包。

所以到这里 https://mvnrepository.com/artifact/org.jboss.netty/netty 这条路是死了。

但是中央仓库中org.jboss.nettyhttps://mvnrepository.com/artifact/org.jboss.netty/netty 这个页面中的一段说明引起了我的注意。

Note: This artifact was moved to:

io.netty » netty

对,就是上面这段话,我在下图圈出了它。



它告诉我们org.jboss.netty >> netty已经迁移到了io.netty >> netty

而且它还提供了跳转链接:https://mvnrepository.com/artifact/io.netty/netty ,所以我就点了进去。



进去后发现这个页面里归档了3.3.x3.10.x,以及4.0.x的 netty 制品。

我先拿3.10.6.Final试了下

<!-- https://mvnrepository.com/artifact/io.netty/netty -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty</artifactId>
<version>3.10.6.Final</version>
</dependency>

重新编译之后发现所有的import都没问题了,但是会有部分类的部分方法缺失。

这个时候感觉版本已经比较接近了相对正确的版本了,接下来就选了跟它最近的次新版本3.9.9.Final

编译之后发现完全没问题了,在3.10.6.Final中缺失(已被删除的)的方法果然是在3.9.9.Final标记删除的方法。



所以基本上可以认为3.9.9.Final极有可能是这个三方 jar 所依赖的 netty 的版本。

稍微有点儿意外的发现,就是在3.3.x3.10.x中虽然依赖坐标中的 groupId 是 io.netty 但是实际的包路径却是 org.jboss.netty.xxx,也算是涨了知识啦。

然后就是 https://mvnrepository.com/artifact/io.netty/netty 这个页面上同样有一段说明

Note: This artifact was moved to:

io.netty » netty-all



就是上图中我圈出的部分,就是说io.netty >> netty已经迁移到了io.netty >> all了。

同时这个在netty的官网中也有说明

好奇害死猫,所以我就又跑去 https://mvnrepository.com/artifact/io.netty/netty-all 这个页面看了看。



我发现io.netty >> all中归档了4.0.x4.1.x以及最新的5.0.x

经过对比确认我发现在3.2.x及其之前的版本中 netty 的 groupId 是org.jboss.netty,artifactId 是netty,包路径是org.jboss.netty

3.3.x3.10.x中 netty 的 groupId 是io.netty,artifactId 是netty,包路径是org.jboss.netty

4.0.0.Final及其之后的版本中netty的 groupId 是io.netty,artifactId 是netty-all,包路径是io.netty

version groupId artifactId package
<=3.2.x org.jboss.netty netty org.jboss.netty
3.3.x~3.10.x io.netty netty org.jboss.netty
=>4.0.0.Final io.netty netty-all io.netty

所以3.9.9.Final就是这个三方 jar 所依赖的 netty 的版本,应该符合预期。

然后就用同事发来的 jar 对应的源码加上我添加的 pom 文件的信息,快速重新打了个包发给了他去救火。

他测试一下,最终给的反馈是完全没问题。

到这里这次给一个无依赖坐标的三方类库项目确定 netty 依赖版本之旅就算结束了。

最后回到了文章开始的问题,你知道这种无明确依赖坐标信息的 jar 包是如何生成的呢?为什么会有这种 jar 出现呢?它有什么弊端吗?

我们下一篇文章见!

一个SDK给我干懵逼了?大厂的SDK就这?的更多相关文章

  1. 大厂的 SDK 写法,偷学到了!

    自己动手写 SDK 的经验技巧分享 大家好,我是鱼皮. 最近因为工作需要,自己动手写了一些项目的通用 SDK.在编写的过程中,我阅读和参考了不少公司中其他大佬写的 SDK,也总结了一些开发 SDK 的 ...

  2. [转]关于sdk更新Android SDK Tools 25.3.1版本后使用sdk manager闪退

    昨天这两个manager还工作正常,今天更新了一下,发现不可用了,运行avd manager和sdk manager没反应,搜了好多文章,然后看到了下这篇文章<关于sdk更新Android SD ...

  3. 【iOS与EV3混合机器人编程系列之中的一个】iOS要干嘛?EV3能够更酷!

    乐高Mindstorm EV3智能机器人(下面简称EV3)自从在2013年的CES(Consumer Electronics Show美国消费电子展)上展出之后,就吸引了全球广大机器人爱好者的眼球!E ...

  4. 【记录一个问题】opencv官网的opencv android sdk使用opencl并未用到GPU

    UMat u_mat;mat.copyTo(u_mat);cv::cvtColor(u_mat, cv::BGR2GARY);这样的代码反复执行,并未发现GPU占用提升.执行时间与不使用UMat相当. ...

  5. SDK 开发 .a .framework .bundle (xcode引用) 依赖sdk工程

    一. 静态库.a 1.创建静态库工程 Cocoa Touch Static Libray  ,然后可以创建一个测试视图 TestView 2.暴露头文件 -> Build Phases--> ...

  6. Android SDK升级后报错error when loading the sdk 发现了元素 d:skin 开头无效内容

    把错误位置的devices.xml这个文件删除,再把sdk里面tools\lib下的这个文件拷贝到你删除的那个文件夹里,重启eclipse

  7. iOS Swift WisdomScanKit二维码扫码SDK,自定义全屏拍照SDK,系统相册图片浏览,编辑SDK

    iOS Swift WisdomScanKit 是一款强大的集二维码扫码,自定义全屏拍照,系统相册图片编辑多选和系统相册图片浏览功能于一身的 Framework SDK [1]前言:    今天给大家 ...

  8. 准备开一个地图SDK的开源项目

    最近有点空闲时间了, 准备开一个地图SDK的开源项目, 现在的地图SDK已经有很多了, 再做一个跟重新发明个轮子差不多, 但还想做的原因是想在别的轮子的基础上造个轮子... 初步设想是基于开源的地图渲 ...

  9. 基于Win32 SDK实现的一个简易线程池

    利用C++实现了一个简易的线程池模型(基于Win32 SDK),方便使用多线程处理任务.共包含Thread.h.Thread.cpp.ThreadPool.h.ThreadPool.cpp四个源文件. ...

随机推荐

  1. [Qt] 信号和槽

    信号与槽:是一种对象间的通信机制 观察者模式:当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种发出是没有目的的,类似广播.如果有对象对这个信号感兴趣,它就 ...

  2. CSS中的颜色、长度、角度、时间

    一.颜色的表示方法 颜色是通过对红.绿和蓝光的组合来显示的. 1.颜色名 1 <!DOCTYPE html> 2 <html lang="en"> 3 &l ...

  3. Linux_yum命令详解

    一.yum命令语法 yum [options] [command] [package ...] 二.yum命令常用的选项: yum options -y //自动回答为"yes" ...

  4. USB历代标准及接口发展

    USB历代标准及接口发展 浊酒一杯家万里关注 2017.11.20 14:54:21字数 3,684阅读 2,514 文章转自中关村在线 1,多功能正反插 苹果让大众认识Type-C "Ty ...

  5. declaration may not appear after executable statement in block--转载

    这个问题是在编译STM32的程序时遇到的,这个错误的原因是对于变量的声明不能放在可执行语句后面,必须在主函数开头声明变量.在程序中声明一个变量时,需要在可执行语句之前声明,否则会出现以上错误. 例: ...

  6. 关于Linux的一些基础命令

    今天学习scala语言,在linux系统上运行,发现对Linux的命令不太熟悉,为了熟悉掌握,也便于查询,这些命令主要是为了收藏备用,,希望能帮助到大家 linux20个常用命令是: 1.显示日期的指 ...

  7. Docker环境下运行python+selenium+chrome

    Docker环境下运行python+selenium+chrome docker运行时占用的资源非常少,而且能将环境进行有效的隔离,可以快速的进行部署,因此可以将docker与selenium结合实现 ...

  8. grasshopper DataTree 树形数据以及Graft Flatten Simplify的理解

    问题的来源: 要在grasshopper里面输出 类似于二维数组的数据 但是在 grasshopper里的 C# 电池里面,无法显示 二维ArrayList里面的数据. 在 C# 电池里参考这个帖子: ...

  9. 图分析Rapids cuGraph

    图分析Rapids cuGraph 英伟达(Nvidia)建立的新的开源库可能是推进分析和使图形数据库更快的秘密要素. 在Nvidia GPU上进行并行处理. Nvidia很久以前就不再只是" ...

  10. 利用NVIDIA NGC的TensorRT容器优化和加速人工智能推理

    利用NVIDIA NGC的TensorRT容器优化和加速人工智能推理 Optimizing and Accelerating AI Inference with the TensorRT Contai ...