4

我有一个需要 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

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

4

2 回答 2

5

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

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 以上的任何版本)。

于 2013-07-21T15:02:09.703 回答
3

您的问题似乎Codec不是找不到类,而是找不到另一个类(它是一个 SPI 提供程序)(请参阅 参考资料Caused by)。如果您在最底部的Lucene 包描述中看到(另请参见此处),则该类在META-INF您的一个 jar 的文件夹中被声明为 SPI 提供程序。

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

希望能帮助到你

于 2013-07-21T13:09:40.390 回答