java.lang.NoClassDefFoundError:org / apache / lucene / codecs / Codec

时间:2013-07-21 08:28:56

标签: java android eclipse junit lucene

我有一个需要Lucene( 4.3.0 )的项目并添加以下依赖项: lucene的核,lucene的-分析仪共用,lucene的查询,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

-----结束例外-----

2 个答案:

答案 0 :(得分:5)

谷歌搜索引发了一些有趣的结果。

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

根据上述问题,Android APK构建器会删除META-INF / services目录中的一些文件,这是Lucene所要求的。他们提出了一些解决方法,比如通过在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以上的任何版本)。

答案 1 :(得分:3)

似乎您的问题不是找不到Codec类,而是找不到另一个类(它是一个SPI提供者)(参见Caused by)。如果你在最底部的Lucene package description中看到(也见here),那么这个类在你的一个罐子的META-INF文件夹中被声明为SPI提供者。

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

希望有所帮助