本文转载自微信公众号《小园来也》,作者小园来也。转载本文请联系小袁来也公众号。大家好,我是来也小元,一个爱写bug的程序员。有一天,我正专心写bug,一位同事来找我。据说有一个很特别的三方依赖库的jar包,里面有一些netty的依赖,但是netty的具体版本无法确定,我帮忙看看。还有这个东西?所以我让他把罐子送来看看。收到后赶紧解压。它的目录结构是这样的:当时完全没有按照套路走,pom文件跑哪去了?gradle文件去哪儿了?这是什么黑科技?盯着jar包解压后的文件目录,翻来覆去几遍,找到了相关依赖库的坐标声明文件。于是我问同事有没有源文件,他说有,然后很快就发过去了,比平时叫他吃饭的速度还快。我打开了,还是什么都没有。顿时,感觉这个类库有点不一样了!没有依赖库的坐标,如何判断依赖库的版本呢?同事还在催,能不能把这个类库为什么没有依赖库坐标的点说一下。所以先用一次试一个版本的方法帮他确定自己依赖的netty版本。刚打开一个文件,发现里面有很多org.jboss.netty的依赖。然后打开Maven的中央仓库:https://mvnrepository.com,输入netty关键字搜索。搜索结果前面很多是io.netty的信息,排在第七位的是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版本试了一下。org.jboss.nettynetty3.2.10.Final添加以上依赖坐标信息后,尝试编译源码,发现缺少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引起了我的注意。注意:此工件已移至: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.xnetty产品在本页。我首先尝试了3.10.6.Finalio.nettynetty3.10.6.Final重新编译后,发现所有import都ok了,但是缺少了部分类的一些方法。这个时候感觉版本比较接近相对正确的版本。接下来,我选择了最新的3.9.9.Final版本进行编译。编译后发现完全没有问题。3.10.6.Final中缺失的(已被Deleted替换)方法确实是3.9.9.Final中标记为deleted的方法。所以基本上可以认为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这个页面也有说明注意:这个神器被移动到:io.netty?netty-all就是我在上图中圈出来的部分,也就是说io.netty>>nettyhasmigratedtoio.netty>>all。同时netty官网上也说了这个,好奇害死猫,于是又去https://mvnrepository.com/artifact/io.netty/netty-all看了一下这个页面。我发现4.0.x、4.1.x和最新的5.0.x都存档在io.netty>>all。经过对比确认,发现netty在3.2.x及之前版本的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。versiongroupIdartifactIdpackage<=3.2.xorg.jboss.nettynettyorg.jboss.netty3.3.x~3.10.xio.nettynettyorg.jboss.netty=>4.0.0.Finalio.nettynetty-allio.netty那么3.9.9.Final就是这个三方jar依赖的netty版本,应该符合预期。然后我用同事发来的jar对应的源码加上我添加的pom文件的信息,迅速重新打包发给他救火。他测试了一下,最后反馈说完全没有问题。至此,为一个没有依赖坐标的三方类库项目确定netty依赖版本的旅程就结束了。最后回到文章开头的问题,你知道这种没有显式依赖坐标信息的jar包是怎么生成的吗?为什么会出现这种罐子?它有什么缺点吗?