2013-07-25 52 views
2

例如,java程序如何执行库版本?

如果我有一个程序a.jar取决于log4j-1.0.jar,我做到了,它在我的机器上工作正常。

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

java运行时如何发现?在代码中的例外?这听起来太可怕了...

THanks

回答

0

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

大多数Java类加载器不会对加载库的顺序提供任何保证,所以您确实需要确保不会在您的类路径中复制依赖关系。

+1

它如何回答这个问题,就是如何解决这个问题。 –

+0

在类路径中不应该有两个版本的同一个库。如果你这样做,你不能保证行为。所以唯一的出路是找到并删除多个版本的罐子。 –

+0

你不明白这里的问题。类路径中没有两个版本的jar。类路径中jar版本的问题与用于编译类的jar版本不同。 –

0

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

在Web应用程序的情况下,情况与问题所暗示的一样可怕。例如,我们可能会在Tomcat的/ lib目录中放置一些库文件,然后部署一些取决于其中一个版本的war文件。唯一的失败依赖的迹象将是一些(可能是非显而易见的)异常。由于REST风格的Web服务的泽西版本的差异,我正在拉我的头发。

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