2013-07-21 145 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測試運行器可能會讓你的類路徑變得混亂(請參閱消息:*當前類路徑支持以下名稱:[] *)。你可以添加你試圖運行的測試的整個代碼嗎? –

相關問題