2013-07-21 90 views
4

我有一个项目需要的Lucene(4.3.0),并添加以下dependenies: Lucene的核心,的Lucene分析仪常见,lucene-查询的Lucene QueryParser的。java.lang.NoClassDefFoundError:组织/阿帕奇/ Lucene的/编解码器/解码器

而且,在添加lucene-codecs依赖项之后,也会得到相同的错误。

但是,Lucene的核心jar包含编解码器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 

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

+0

已标记为您在Eclipse中导出的依赖项? – Desert

+0

这是一个maven项目,编码在elcipse.all中可以编译。 但运行测试代码时出错。 – CHmoonKa

回答

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

+0

我使用maven-android-plugin在android中成功运行Lucene4x。 如何使用“右键单击测试代码类 - >运行 - > Android的Junit测试”在Eclipse中运行测试代码? – CHmoonKa

+0

嗨CHmoonKa。恐怕我不熟悉在Eclipse中构建Android应用程序。他们使用什么构建系统?他们有一个Ant构建文件(build.xml)?如果他们正在使用Ant,那么可以在构建文件中添加某种后编译目标,将必要的文件从Lucene jar复制到APK中。 –

3

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

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

希望它可以帮助

+0

非常感谢。我忙了一段时间。我可以在lucene-core.jar中找到META-INF/services/org.apache.lucene.codecs.Codec,但它在android apk文件的META-INF目录下不存在。 – CHmoonKa

+0

@CHmoonKa该文件只需要存在于类路径中的jar中。看来这个实现类在'lucene-core'里面,但它没有机会被加载。 Android测试运行器可能会让你的类路径变得混乱(请参阅消息:*当前类路径支持以下名称:[] *)。你可以添加你试图运行的测试的整个代码吗? –

相关问题