java程序如何实施库版本?

时间:2013-07-25 05:41:05

标签: java jar version

例如,

如果我有一个程序a.jar依赖于log4j-1.0.jar,我就可以在我的机器上运行它。

稍后,我将我的程序复制到另一台机器,它有log4j-2.0.jar,与我的程序不兼容。

java运行时将如何发现?代码中有异常吗?这听起来太可怕......

感谢

2 个答案:

答案 0 :(得分:0)

我遇到过这种情况一次。是,如果您在类路径中提供两个不同的log4j库版本,Java运行时将发现它们并且无法保证哪些将被拾取并且可能导致异常/错误特别是如果库不向后兼容

大多数Java类加载器都不保证加载库的顺序,因此您确实需要确保不要在类路径上复制依赖项。

答案 1 :(得分:0)

这个问题在Web容器的上下文中是有意义的。如果我们讨论的是桌面或JNLP应用程序,那么答案很简单:所有库jar依赖项都应与您的应用程序打包在一起。除非我们明确地将它放在那里,否则我们永远不能依赖某个库文件在客户机的类路径上,在这种情况下我们会知道找到了哪个版本的库。

对于网络应用程序,情况与问题建议完全一样可怕。例如,我们可能会在Tomcat的/ lib目录中放置一些库文件,然后部署一些依赖于其中一个版本的war文件。失败依赖的唯一指示是一些(可能是非显而易见的)异常。对于RESTful Web服务的泽西岛版本的差异,我正在把头发拉出来。

解决方案是再次将所有内容打包到您的应用程序中。这可能会使war文件非常大,但只需更新相关文件然后重新启动容器即可完成重新部署。一些云服务提供商强迫我们这样做,因为开发人员无权访问shared / lib目录。