由于各种历史原因,我有一个旧的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的旧(或更新)版本。
答案 0 :(得分:2)
哪个类在jarpath中是第一个jar,当JVM类加载器正在寻找一个类时会被选中。因此,您可以尝试以不同的顺序添加这些jar,以检查哪个jar破坏了您的应用程序
答案 1 :(得分:1)
如果要共享这样的lib目录,则每个应用程序都需要在类路径上显式列出明确使用的JAR文件。如果您使用通配符类路径条目(例如“ lib / *”),则未指定将使用哪个版本的JAR。 manual entry指出:
类路径通配符
类路径条目可以包含基本名称通配符(),它被认为等同于指定目录中所有扩展名为.jar或.JAR的文件的列表。例如,类路径条目mydir / 指定名为mydir的目录中的所有JAR文件。由*组成的类路径条目扩展为当前目录中所有jar文件的列表。不论文件是否被隐藏(文件名都以“。”开头)都被视为文件。
....
在目录中枚举目录中JAR文件的顺序 未指定扩展的类路径,并且可能因平台而异 平台,甚至不时在同一台机器上。一种 结构合理的应用程序不应依赖于任何特定的 订购。 如果需要特定的订单,则可以将JAR文件 在类路径中明确列出。