2016-04-21 47 views
2

我構建了一個用於索引的Java應用程序。我正在使用Apache Lucene 5.3.1。 當我在IDE(IntelJ IDEA 2016.1.1 Community Edition)中運行應用程序時,它運行正常。當我嘗試從jar文件的應用程序,我得到這個例外Maven包裝失敗Lucene,SPI不存在異常

Exception in thread "main" java.util.ServiceConfigurationError: Cannot instantiate SPI class: org.apache.lucene.codecs.lucene53.Lucene53Codec 
    at org.apache.lucene.util.NamedSPILoader.reload(NamedSPILoader.java:77) 
    at org.apache.lucene.util.NamedSPILoader.<init>(NamedSPILoader.java:47) 
    at org.apache.lucene.util.NamedSPILoader.<init>(NamedSPILoader.java:37) 
    at org.apache.lucene.codecs.Codec$Holder.<clinit>(Codec.java:47) 
    at org.apache.lucene.codecs.Codec.getDefault(Codec.java:140) 
    at org.apache.lucene.index.LiveIndexWriterConfig.<init>(LiveIndexWriterConfig.java:120) 
    at org.apache.lucene.index.IndexWriterConfig.<init>(IndexWriterConfig.java:140) 
    . 
    . 
Caused by: java.lang.IllegalArgumentException: An SPI class of type org.apache.lucene.codecs.PostingsFormat with name 'Lucene50' does not exist.  You need to add the corresponding JAR file supporting 
this SPI to your classpath. The current classpath supports the following names: [IDVersion] 
    at org.apache.lucene.util.NamedSPILoader.lookup(NamedSPILoader.java:109) 
    at org.apache.lucene.codecs.PostingsFormat.forName(PostingsFormat.java:112) 
    at org.apache.lucene.codecs.lucene53.Lucene53Codec.<init>(Lucene53Codec.java:160) 
    at org.apache.lucene.codecs.lucene53.Lucene53Codec.<init>(Lucene53Codec.java:80) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at java.lang.Class.newInstance(Unknown Source) 
    at org.apache.lucene.util.NamedSPILoader.reload(NamedSPILoader.java:67) 
    ... 13 more 

有一個類似的問題here,但與Maven遮陽簾插件的解決方案並沒有幫助。 這裏是pom.xml相關的段。

<dependency> 
      <groupId>org.apache.lucene</groupId> 
      <artifactId>lucene-core</artifactId> 
      <version>5.3.1</version> 
     </dependency> 

     <dependency> 
      <groupId>org.apache.lucene</groupId> 
      <artifactId>lucene-analyzers-common</artifactId> 
      <version>5.3.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.lucene</groupId> 
      <artifactId>lucene-queryparser</artifactId> 
      <version>5.3.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.lucene</groupId> 
      <artifactId>lucene-codecs</artifactId> 
      <version>5.3.1</version> 
     </dependency> 
    ... 
    <transformers> 
     <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
      <resource>META-INF/services/org.apache.lucene.analysis.util.CharFilterFactory</resource> 
     </transformer> 
     <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
      <resource>META-INF/services/org.apache.lucene.analysis.util.TokenFilterFactory</resource> 
     </transformer> 
     <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
      <resource>META-INF/services/org.apache.lucene.analysis.util.TokenizerFactory</resource> 
     </transformer> 
     <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
      <resource>META-INF/services/org.apache.lucene.codecs.Codec</resource> 
     </transformer> 
     <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
      <resource>META-INF/services/org.apache.lucene.codecs.DocValuesFormat</resource> 
     </transformer> 
     <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
      <resource>META-INF/services/org.apache.lucene.codecs.PostingsFormat</resource> 
     </transformer> 
</transformers> 

問題是,由於某些原因,它試圖從Lucene50加載一些東西。

任何幫助都是有價值的!

+0

嗨我只是想知道你是否解決了這個問題,因爲我得到了同樣的問題 – Ziqi

+0

我太面臨這個問題 - 任何解決方案? – Ralph

回答

1

這就是我這個問題(Maven的)

`<plugin> 
    <artifactId>maven-shade-plugin</artifactId> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
      <filters> 
       <filter> 
        <artifact>*:*</artifact> 
        <excludes> 
         <exclude>META-INF/*.RSA</exclude> 
         <exclude>META-INF/*.SF</exclude> 
        </excludes> 
       </filter> 
      </filters> 
       <transformers> 
        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
         <resource>META-INF/services/org.apache.lucene.codecs.Codec</resource> 
        </transformer> 
        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
         <resource>META-INF/services/org.apache.lucene.codecs.DocValuesFormat</resource> 
        </transformer> 
        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
         <resource>META-INF/services/org.apache.lucene.codecs.PostingsFormat</resource> 
        </transformer> 
        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
         <mainClass>mainClassName</mainClass> 
        </transformer> 
       </transformers> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
` 

文件org.apache.lucene.codecs.Codec,org.apache.lucene.codecs.DocValuesFormat,org.apache.lucene.codecs的解決方案。 PostingsFormat包含有關項目中使用的編解碼器的信息。它們應該放在META-INF/services目錄下(如果不存在,應該創建)。在我的情況下,問題在於幾個postsFormats,Codecs和DocValuesFormats,我將它們添加到文件中,問題解決了。 org.apache.lucene.codecs.Codec文件的

實施例:

org.apache.lucene.codecs.simpletext.SimpleTextCodec 
org.apache.lucene.codecs.appending.AppendingCodec 
org.apache.lucene.codecs.lucene40.Lucene40Codec 
org.apache.lucene.codecs.lucene410.Lucene410Codec 
org.apache.lucene.codecs.lucene41.Lucene41Codec 

org.apache.lucene.codecs.DocValuesFormat文件的實施例:

org.apache.lucene.codecs.memory.MemoryDocValuesFormat 
org.apache.lucene.codecs.memory.DirectDocValuesFormat 
org.apache.lucene.codecs.lucene410.Lucene410DocValuesFormat 

實施例ofg.apache.lucene.codecs.PostingsFormat文件:

org.apache.lucene.codecs.bloom.BloomFilteringPostingsFormat 
org.apache.lucene.codecs.memory.DirectPostingsFormat 
org.apache.lucene.codecs.memory.FSTOrdPostingsFormat 
org.apache.lucene.codecs.memory.FSTPostingsFormat 
org.apache.lucene.codecs.memory.MemoryPostingsFormat 
org.apache.lucene.codecs.lucene40.Lucene40PostingsFormat 
org.apache.lucene.codecs.lucene41.Lucene41PostingsFormat 

在你的情況下,你應該爲Lucene50做同樣的事情。