【问题标题】:what causes java.lang.NoClassDefFoundError to occur randomly?是什么导致 java.lang.NoClassDefFoundError 随机发生?
【发布时间】:2020-07-22 09:12:07
【问题描述】:

我们的服务器中随机出现 NoClassDefFoundError。它偶尔会抛出此错误,并且大多数时候它运行时不会抛出任何问题。这种奇怪行为的原因可能是什么?以下是例外情况。

java.lang.NoClassDefFoundError: Could not initialize class com.github.junrar.Archive
at org.apache.tika.parser.pkg.RarParser.parse(RarParser.java:75)
at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:280)
at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:280)
at org.apache.tika.parser.AutoDetectParser.parse(AutoDetectParser.java:143)
at org.apache.tika.Tika.parseToString(Tika.java:527)
at org.apache.tika.Tika.parseToString(Tika.java:602)
at com.xxx.attachment.AttachmentExtractionAPI.parse(AttachmentExtractionAPI.java:108)

com.github.junrar.Archive 存在于包含其他 tika 依赖项的同一个 jar 中。

我尝试查看 Archive.java 的 source。在静态块中寻找一些可能的运行时异常。但它本身没有静态块。是什么让它随机抛出异常并且有时运行没有任何问题?

编辑:-

我们使用 ant 来构建。下面是 ant.properties 中控制 tika 依赖关系的部分。 Junrar 作为 tika 的一部分提供。

tika_jar_file=${prod_home}/tikalib/tika-app-1.24.jar
tika_jar_srcdir=${tp_pkg}/tika
tika_jar_includes=**
tika_jar_excludes=org/apache/tika/parser/** org/apache/xerces/** org/apache/html/** org/apache/wml/** org/apache/xml/** org/xml/sax/** org/apache/xmlcommons/** javax/xml/** org/w3c/dom/**

tika_update_jar_file=${prod_home}/tikalib/tika-app-1.24.jar
tika_update_jar_srcdir=${tp_pkg}/tika
tika_update_jar_includes=org/apache/tika/parser/asm/** org/apache/tika/parser/chm/** org/apache/tika/parser/code/** org/apache/tika/parser/epub/** org/apache/tika/parser/html/** org/apache/tika/parser/iwork/** org/apache/tika/parser/mail/** org/apache/tika/parser/mbox/** org/apache/tika/parser/microsoft/** org/apache/tika/parser/odf/** org/apache/tika/parser/pdf/** org/apache/tika/parser/pkg/** org/apache/tika/parser/rtf/** org/apache/tika/parser/strings/** org/apache/tika/parser/txt/** org/apache/tika/parser/utils/** org/apache/tika/parser/xml/** org/apache/tika/parser/*.* org/apache/tika/parser/image/** org/apache/tika/parser/ocr/** org/apache/tika/parser/csv/** javax/xml/bind/**
tika_update_jar_excludes=
tika_update_jar_update=true

【问题讨论】:

  • 我只看到private static Logger logger = Logger.getLogger(Archive.class.getName()); 是在静态上下文中运行的代码。理论上可以抛出 OOM。
  • 获取记录器时出现OOM?将检查可能性。

标签: java ant noclassdeffounderror


【解决方案1】:

关键是理解错误信息:

java.lang.NoClassDefFoundError: Could not initialize class
     com.github.junrar.Archive

请注意,它表示它不能初始化该类。无法初始化类有几个原因。其中包括:

  • 在这个类的初始化过程中抛出了一个未经检查的异常(并且没有处理)。如果发生这种情况,那么应该有一个更早的异常和堆栈跟踪,告诉您抛出了什么异常以及在哪里抛出。

  • 这个类对另一个初始化失败的类有静态依赖。 那个失败应该有一个更早的异常和堆栈跟踪。

  • 可能存在依赖性问题,尽管在这种情况下我会期待一个不同的异常消息。

【讨论】:

  • 这是完整的堆栈跟踪。这个类没有静态块。唯一的静态变量是 java logger(源链接有问题)。奇怪的是它并不总是抛出这个异常。随机抛出。
【解决方案2】:

NoClassDefFoundError的原因是你的项目的两个不同的jar依赖于同一个不同版本的jar。所以你可以使用ide来排除你pom中的jar。

【讨论】:

  • 在我的例子中,tika 使用了 junrar 依赖。我认为我们没有捆绑任何其他版本。
  • 你能发布你的 pom.xml 吗?让我看看你的依赖关系。
  • 好的,我认为问题是tika依赖于com.github.junrar.Archive。你项目中的另一个jar也依赖于com.github.junrar.Archive。让我们设置第一个com.github.junrar.Archive的版本为1.0,另外一个2.0。所以类加载器会随机加载1.0或2.0。解决问题的方法是在另一个jar中排除2.0。
  • 1. junrar 只捆绑在一个地方。 (inside tika) 2. 只有 tika 使用 junrar。我们有一个名为 tikalib 的单独适配器来解决这种多版本问题。因此,tikalib 文件夹中只有 tika 依赖项可用。只有 tika 会使用它。 com.github.junrar.Archive 在 tikalib 中可用。
猜你喜欢
  • 2013-02-26
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 2015-07-22
  • 1970-01-01
相关资源
最近更新 更多