java如何选择.JAR库版本

java如何选择.JAR库版本,java,Java,出于各种历史原因,我有一个旧的java应用程序,它与其他一些应用程序共享library.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文件?据我所知,类路径只

出于各种历史原因,我有一个旧的java应用程序,它与其他一些应用程序共享library.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文件?据我所知,类路径只是设置为./lib/。但是它使用Tanuki服务包装器来启动,所以我不能100%确定这一点

我无法删除任何现有的.jar,是否有方法指定我的应用程序将使用哪些.jar


在修补了这个旧应用程序之后,现在我得到了一个NoClassDefFoundError,我怀疑该应用程序正在加载一个与另一个库BoneCP和slf4j冲突的.JAR的较旧或较新版本。

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

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

如果您要像这样共享lib目录,那么每个应用程序都需要在类路径上明确列出它使用的JAR文件。如果使用通配符类路径条目,例如lib/*,则不会指定将使用哪些版本的JAR。各国:

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

目录中的JAR文件在 未指定扩展类路径,可能因平台而异 平台,甚至有时在同一台机器上。A. 构造良好的应用程序不应依赖于任何特定的 顺序如果需要一个特定的顺序,那么JAR文件可以是 在类路径中显式枚举


如果要像这样共享lib目录,那么每个应用程序都需要在类路径上明确列出它使用的JAR文件。如果使用通配符类路径条目,例如lib/*,则不会指定将使用哪些版本的JAR。各国:

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

目录中的JAR文件在 未指定扩展类路径,可能因平台而异 平台,甚至有时在同一台机器上。A. 构造良好的应用程序不应依赖于任何特定的 顺序如果需要一个特定的顺序,那么JAR文件可以是 在类路径中显式枚举


在类路径中具有不同版本的相同库总是不好的。要么只使用一个版本,然后您可以轻松删除另一个版本,要么两者都使用,因为它们不包含完全相同的类,但由于一个版本使用另一个库中的公共类,因此几乎肯定会发生冲突。在类路径中的不同版本中使用相同的库总是不好的。要么只使用一个版本,那么您可以轻松删除另一个版本,要么使用两个版本,因为它们不包含完全相同的类,但由于一个版本使用另一个库中的公共类,您几乎肯定会遇到冲突;lib/jarfile2.jar;等等。我必须为11罐LIB做这个。我想。。。。您也可以使用符号链接来完成。为每个应用程序创建一个lib目录,并用指向相应JAR版本的符号链接填充它。但是通过包装器脚本显式地命名类路径中的jar更健壮,谢谢Stephen,这正是解决方案-java-cp lib/jarfile1.jar;lib/jarfile2.jar;等等。我必须为11罐LIB做这个。我想。。。。您也可以使用符号链接来完成。为每个应用程序创建一个lib目录,并用指向相应JAR版本的符号链接填充它。但是明确地命名你体内的罐子 通过包装器脚本的r类路径更健壮,