jar的混乱

使用了一阵.net之后回到java上,发现jar包的维护真可以用梦魇来形容。一个class可以有n个jar包,实现的功能差不多,但是又有可能有一些细微的偏差。包含该class的jar有可能是满足当前需要的一个小jar包,也有可能不仅包含该class及其相关的class,还有一堆其他功能的class堆积在这个大的jar包里。有可能当前好好的,以后加入新功能时就有问题了,因为classloader误用了大jar包的同名class。另外,如果不是很熟悉classpath,有可能build时好好的,运行时就有问题了。

java的开放性太高了,任何人,任何组织只要高兴就可以搞一堆jar出来,可以jar名相同内容近似或不同,可以jar名不同内容一样等等等等等等等。基本上一个常用的class都是有n多实现的。其实反转域名的namespace加上classname是一个挺好的方案,可惜没有强制的规定如何打jar包。既一个全名的class在一个基本jar里,不可能存在其他的基本jar里面有同名的class,为了性能或者其他一些情况,可以有一些组合jar,组合jar是基本jar的聚集,不允许只包含一个基本jar的一部分,一个组合jar是一组基本jar的聚集,并且该范围不可改变。

java的jar引用问题。最近用maven,有时候挺不爽的。maven的repo声称解决了jar的管理问题。但是我觉得还是不够的。java的jar往好里说,是很灵活的,基本上想用什么class都可以自己设定,实在不行还可以自定义classloader。往不好里说,完全是自己给自己找麻烦,一个系统上jre,jdk现在都是几套几套的,里面的jar没有重复?估计没有几个人因为空间不够愿意和其他程序共享自己依赖的jar包。所以maven的一个版本的jar只有一个copy到底好不好还是有待商榷的。

倒是.net的模式我觉得挺好的,build是把该dll依赖的dll全部copy到本地目录,除了GAC之外,这样虽然浪费一些空间,但是很整洁,一眼就知道,程序在用什么jar,而且避免了很多classpath设置的错误,以及jar次序的错误。

猜你喜欢

转载自zhang-xzhi-xjtu.iteye.com/blog/395880
jar