例如,
如果我有一个依赖于 log4j-1.0.jar 的程序 a.jar,我会制作它并且它在我的机器上运行良好。
后来,我将我的程序复制到另一台机器上,它有 log4j-2.0.jar,与我的程序不兼容。
java 运行时将如何发现这一点?通过代码中的异常?听起来太吓人了……
谢谢
我曾经遇到过这样的场景。是的,如果您在类路径中提供两个不同的 log4j 库版本,Java 运行时会发现它们,并且无法保证哪个会被拾取,并且可能会导致异常/错误,特别是如果库不向后兼容。
大多数 Java 类加载器不保证加载库的顺序,因此您确实需要确保不要在类路径上重复依赖项。
这个问题在 Web 容器的上下文中是有意义的。如果我们谈论的是桌面或 JNLP 应用程序,那么答案很简单:所有库 jar 依赖项都应该与您的应用程序一起打包。我们永远不能依赖客户端机器的类路径上的某个库文件,除非我们明确地将它放置在那里,在这种情况下,我们会知道找到了哪个版本的库。
对于 Web 应用程序,情况与问题所暗示的一样可怕。例如,我们可能会在 Tomcat 的 /lib 目录中放置一些库文件,然后部署一些依赖于其中一个不同版本的 war 文件。依赖失败的唯一迹象将是一些(可能不是显而易见的)异常。我为 RESTful Web 服务的 Jersey 版本的差异而烦恼。
解决方案再次将所有内容打包到您的应用程序中。这可能会使war文件非常大,但只需更新相关文件然后重新启动容器即可重新部署。一些云服务提供商强迫我们这样做,因为开发人员没有访问共享 /lib 目录的权限。