我有一个需要lucene的项目(4.3.0),并添加了以下依赖项: lucene-core、lucene-分析器-通用的、lucene-查询、lucene-查询解析器。
并且,在添加lucene依赖项之后,也会得到相同的错误。
但是,lucene核心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-结束例外
发布于 2013-07-21 15:02:09
谷歌搜索出一些有趣的结果。
https://issues.apache.org/jira/browse/LUCENE-4204
根据上面的问题,Android构建器删除META/services目录中的一些文件,这是Lucene所需要的。他们提出了一些解决办法,比如在完成APK构建器之后,通过一些ant任务将lucene中的必要文件直接添加到APK中。不过要小心,因为有些lucene jars在META/services目录中使用相同的文件,您可能会不成功地覆盖它们。
实际上,我建议您使用android插件,因为他们已经为此应用了一个修复程序(参见https://code.google.com/p/maven-android-plugin/issues/detail?id=97)。只需使用插件的最新版本(或3.2.1以上的任何版本)。
发布于 2013-07-21 13:09:40
您的问题似乎不是找不到Codec类,而是找不到另一个类(它是SPI提供程序)(请参阅Caused by)。如果您在Lucene封装描述中看到最底层(也请参见这里),则在您的jars的META-INF文件夹中,该类被声明为SPI提供程序。
因此,搜索您的jars以找到一个META-INF/services/org.apache.lucene.codecs.Codec文件,打开它并查看类的名称。您丢失了包含该类的jar。
希望它能帮上忙
https://stackoverflow.com/questions/17770451
复制相似问题