Java 类路径不同的顺序是否给出了"No Method found error"



我有一个Scala Akka应用程序,它连接到部署在rancher上的HBase(目前是CDP早期的HDP(;连接HDP hbase时从未遇到任何问题;由于最近HDP到CDP发生了变化,对于相同的映像,我们在其中一个容器中的依赖项的一个类上找不到任何方法,因为同一映像的另一个容器正确地连接到hbase。;即使jar也存在于同一个映像和类路径中。

一个明显的区别是类路径的顺序发生了变化。

  1. 类路径顺序的更改是否会影响jar的可用性
  2. 当java库/类在启动时达到更快的CPU周期时,它们会以不同的顺序加载吗

为什么会出现这样的";找不到类方法";。

如果同一个类文件存在于不同的类路径条目中,它当然可以。例如,如果您的类路径是:java -cp a.jar:b.jar com.foo.App和:

a.jar:
pkg/SomeClass.class
b.jar:
pkg/SomeClass.class

然后这种情况就会发生——通常是因为类路径上的一个jar是比另一个旧的版本,或者是相同但更复杂的:类路径的其中一个jar包含一大堆不同的库,所有这些库都挤在一起,其中一个组件是旧版本。

有一些基本的卫生规则需要遵守:

  1. 不要把罐子挤在一起。如果您有500个dep,请在类路径上放置500个条目。我们有工具来管理这些东西,使用它们。不要做条纹罐子、超级罐子等
  2. 使用依赖项跟踪器来检查依赖链中是否存在版本差异。如果你的应用程序依赖于"hibernate"one_answers"jersey",并且它们都依赖于谷歌的番石榴库,但hibernate导入v26,jersey导入v29,那就有问题了。请注意这一点,并确保您明确决定最终制作它的版本。大概,您希望明确选择v29,并检查hibernate是否也在v29*上运行。如果没有,你就有更大的问题。它们是可修复的(使用模块化类加载器(,但并不容易

*(hibernate和jersey实际上都不依赖于番石榴,我只是用它们作为假设的例子。

例如,如果您使用maven,请查看enforcer插件。(groupId:org.apache.maven.plugins,artifactId:maven-enforcer-plugin(。

我敢打赌,CDP中有另一个版本的jar,偶尔它会在您的项目附带的版本之前加载,从而导致错误。

因此,当您的容器启动时,请尝试记录从哪个位置加载冲突类。这个问题可能会帮助您:确定类是来自的哪个JAR文件

最新更新