繁体   English   中英

Java如何选择.JAR库版本

[英]How does java choose a .JAR library version

由于各种历史原因,我有一个旧的Java应用程序,它与其他一些应用程序共享库.JARs的本地lib/目录。 该目录中包含相同库的多个版本副本,例如:

...
log4j-1.2.16.jar
log4j-1.2.17.jar
slf4j-api-1.7.5.jar
slf4j-api-1.7.21.jar
slf4j-log4j12-1.7.5.jar
slf4j-log4j12-1.7.9.jar
...

当我的Java应用启动时,它如何确定要加载哪个.jar文件? 据我所知,CLASSPATH只是设置为./lib/ 但是它使用Tanuki Service包装器启动,因此我对此不是100%肯定。

我无法删除所有这些现有的.JAR,有没有一种方法可以确切指定我的应用将使用哪些.JAR?

修补此旧应用程序后,现在我收到一个NoClassDefFoundError,我怀疑该应用程序正在加载与另一个库(BoneCP和slf4j)冲突的.JAR的旧(或更新)版本。

JVM classloader在寻找类时,首先在类路径中找到哪个jar。 因此,您可以尝试以不同的顺序添加这些罐子,以检查哪个罐子破坏了您的应用程序

如果要共享这样的lib目录,则每个应用程序都需要列出它在类路径上显式使用的JAR文件。 如果使用通配符类路径条目(例如“ lib / *”),则未指定将使用哪个版本的JAR。 手册条目指出:

类路径通配符

类路径条目可以包含基本名称通配符( ),它被认为等效于指定扩展名为.jar或.JAR的目录中所有文件的列表。 例如,类路径条目mydir /指定目录mydir中的所有JAR文件。 由*组成的类路径条目扩展为当前目录中所有jar文件的列表。 无论文件是否被隐藏(文件名以“。”开头)都将被视为文件。

....

在扩展的类路径中枚举目录中JAR文件的顺序未指定,并且可能因平台而异,甚至在同一台计算机上有时也有所不同。 结构良好的应用程序不应依赖于任何特定顺序。 如果需要特定顺序,则可以在类路径中显式枚举JAR文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM