Java如何选择.JAR库版本

时间:2018-11-08 04:01:28

标签: java

由于各种历史原因,我有一个旧的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的旧(或更新)版本。

2 个答案:

答案 0 :(得分:2)

哪个类在jarpath中是第一个jar,当JVM类加载器正在寻找一个类时会被选中。因此,您可以尝试以不同的顺序添加这些jar,以检查哪个jar破坏了您的应用程序

答案 1 :(得分:1)

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

  

类路径通配符

     

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

     

....

     

在目录中枚举目录中JAR文件的顺序   未指定扩展的类路径,并且可能因平台而异   平台,甚至不时在同一台机器上。一种   结构合理的应用程序不应依赖于任何特定的   订购。 如果需要特定的订单,则可以将JAR文件   在类路径中明确列出。