活久见 。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.x、3.1.x、3.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.x、3.1.x、3.2.x这个三个系列的版本里没有合适的。

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

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

但是中央仓库中org.jboss.netty:https://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.x~3.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.x~3.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.x、4.1.x以及最新的5.0.x

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

3.3.x~3.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. zimbra启用SMTP认证

    zmprov modifyServer {{ you domain }} zimbraMtaTlsAuthOnly FALSE zmcontrol restart 查看对应配置 zmprov getS ...

  2. [bug] eclipse 点击new菜单后没有新建java project或class选项

    参考 https://blog.csdn.net/u013001763/article/details/54405758

  3. [Java] HOW2J(Java中级)

    异常 定义:导致程序正常流程被中断的事件 异常处理常见手段 try catch:将可能抛出异常的代码放在try的块中,一旦出现异常就跳转到catch的块中处理 throws/throw:不在本模块处理 ...

  4. 使用python实现钉钉告警通知功能

    前言:日常工作中告警通知是必不可少的,一般会使用邮件.钉钉.企业微信等,今天分享一下使用python实现钉钉告警 一. 钉钉机器人创建 登录钉钉客户端,创建一个群,把需要收到报警信息的人员都拉到这个群 ...

  5. Archlinux zsh终端美化 powerlevel10k配置

    环境 Arch Linux + KDE Plasma 安装zsh yay -S zsh 更改默认终端 chsh -s /bin/zsh 安装oh-my-zsh-git archlinuxcn源有打好的 ...

  6. Java并发之AQS原理剖析

    概述: AbstractQueuedSynchronizer,可以称为抽象队列同步器. AQS有独占模式和共享模式两种: 独占模式: 公平锁: 非公平锁: 共享模式: 数据结构: 基本属性: /** ...

  7. Go语言标准库log介绍

    Go语言标准库log介绍 无论是软件开发的调试阶段还是软件上线之后的运行阶段,日志一直都是非常重要的一个环节,我们也应该养成在程序中记录日志的好习惯. log Go语言内置的log包实现了简单的日志服 ...

  8. Mysql索引创建及删除

    1.索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的My ...

  9. 微信内 H5 页面自定义分享

    起源: 最近公司在做一个活动的h5页面,在微信内打开时需要进行微信授权,然后后端会重定向到这个页面并且携带了一些参数(openid等).问题是点击微信的原生分享时,会把携带的这些参数一起分享出去,等于 ...

  10. 机器学习PAL产品优势

    机器学习PAL产品优势 PAI支持丰富的机器学习算法.一站式的机器学习体验.主流的机器学习框架及可视化的建模方式.本文介绍PAI的产品优势. 丰富的机器学习算法 PAI的算法都经过阿里巴巴集团大规模业 ...