【问题标题】:java.lang.NoClassDefFoundError: org/apache/lucene/codecs/Codecjava.lang.NoClassDefFoundError: org/apache/lucene/codecs/Codec
【发布时间】:2013-07-21 08:28:56
【问题描述】:

我有一个项目需要 Lucene(4.3.0) 并添加以下依赖项: lucene-core,lucene-analyzers-common,lucene-queries,lucene-queryparser.

而且,添加 lucene-codecs 依赖后,也会出现同样的错误。

但是,lucene-core jar 包含 Codec class

----- 开始异常 -----

I/TestRunner(2443): java.lang.NoClassDefFoundError: org/apache/lucene/codecs/Codec
I/TestRunner(2443):     at org.apache.lucene.index.LiveIndexWriterConfig.<init>(LiveIndexWriterConfig.java:118)
I/TestRunner(2443):     at org.apache.lucene.index.IndexWriterConfig.<init>(IndexWriterConfig.java:144)
I/TestRunner(2443):     at com.my.search.SearchIndexManager.newWriter(SearchIndexManager.java:301)
I/TestRunner(2443):     at com.my.search.SearchIndexManager.addIndexState(SearchIndexManager.java:95)
I/TestRunner(2443):     at com.my.SearchOperation.addIndexer(SearchOperation.java:68)
I/TestRunner(2443):     at com.my.test.SearchOperationTest.testSearchWithFilter(SearchOperationTest.java:208)
I/TestRunner(2443):     at java.lang.reflect.Method.invokeNative(Native Method)
I/TestRunner(2443):     at java.lang.reflect.Method.invoke(Method.java:511)
I/TestRunner(2443):     at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
I/TestRunner(2443):     at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
I/TestRunner(2443):     at junit.framework.TestCase.runBare(TestCase.java:134)
I/TestRunner(2443):     at junit.framework.TestResult$1.protect(TestResult.java:115)
I/TestRunner(2443):     at junit.framework.TestResult.runProtected(TestResult.java:133)
I/TestRunner(2443):     at junit.framework.TestResult.run(TestResult.java:118)
I/TestRunner(2443):     at junit.framework.TestCase.run(TestCase.java:124)
I/TestRunner(2443):     at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190)
I/TestRunner(2443):     at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175)
I/TestRunner(2443):     at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
I/TestRunner(2443):     at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1584)
I/TestRunner(2736): Caused by: java.lang.IllegalArgumentException: A SPI class of type org.apache.lucene.codecs.Codec with name 'Lucene42' does not exist. You need to add the corresponding JAR file supporting this SPI to your classpath.The current classpath supports the following names: []
I/TestRunner(2736):     at org.apache.lucene.util.NamedSPILoader.lookup(NamedSPILoader.java:109)
I/TestRunner(2736):     at org.apache.lucene.codecs.Codec.forName(Codec.java:95)
I/TestRunner(2736):     at org.apache.lucene.codecs.Codec.<clinit>(Codec.java:122)
I/TestRunner(2736):     ... 19 more

-----结束异常-----

【问题讨论】:

  • 已将您的依赖项标记为在 Eclipse 中导出?
  • 这是一个 maven 项目,在 elcipse 中编码。编译时一切正常。但是运行测试代码时出错。

标签: java android eclipse junit lucene


【解决方案1】:

谷歌搜索出现了一些有趣的结果。

https://issues.apache.org/jira/browse/LUCENE-4204

根据上述问题,Android APK builder 移除了 Lucene 需要的 META-INF/services 目录中的一些文件。他们建议了一些解决方法,例如通过在 APK 构建器完成后完成的一些 ant 任务将 lucene jar 中的必要文​​件直接添加到 APK。请小心,因为某些 lucene jar 使用 META-INF/services 目录中的相同文件,您可能会不必要地覆盖它们。

我实际上建议您使用 android maven 插件,因为他们已经对此进行了修复(请参阅 https://code.google.com/p/maven-android-plugin/issues/detail?id=97)。只需使用最新版本的插件(或 3.2.1 以上的任何版本)。

【讨论】:

  • 我使用 maven-android-plugin 在 android 中成功运行了 Lucene4x。如何使用“右键单击测试代码类->运行为-> Android Junit Test”在eclipse中运行测试代码?
  • 嗨,CHmoonKa。恐怕我对在 Eclipse 中构建 Android 应用程序不太熟悉。他们使用什么构建系统?他们有一个 Ant 构建文件(build.xml)吗?如果他们使用 Ant,那么可以在构建文件中添加某种编译后目标,将必要的文件从 Lucene jar 复制到 APK。
【解决方案2】:

看来您的问题不是找不到Codec 类,而是找不到另一个类(它是SPI 提供程序)(请参阅Caused by)。如果您在最底部的Lucene package description 中看到(另请参见here),则该类被声明为您的一个jar 的META-INF 文件夹中的SPI 提供程序。

所以搜索你的 jar 以找到一个 META-INF/services/org.apache.lucene.codecs.Codec 文件,打开它并查看类的名称。您缺少包含该类的 jar

希望对你有帮助

【讨论】:

  • 非常感谢。忙了一阵子,可以在lucene-core.jar中找到META-INF/services/org.apache.lucene.codecs.Codec,但是在android apk文件的META-INF目录下不存在。跨度>
  • @CHmoonKa 该文件只需要存在于您的类路径中的 jar 中。似乎实现类在lucene-core 内,但它没有机会被加载。可能是 Android 测试运行程序弄乱了您的类路径(请参阅消息:当前类路径支持以下名称:[])。您可以为您尝试运行的测试添加整个代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
  • 2013-03-19
  • 1970-01-01
  • 2017-03-10
  • 2018-05-24
相关资源
最近更新 更多