2016-04-21 16 views
2

Ich habe eine Java-Anwendung für die Indizierung erstellt. Ich benutze Apache Lucene 5.3.1. Wenn ich die Anwendung in IDE (IntelJ IDEA 2016.1.1 Community Edition) ausführen, wird es normal ausgeführt. Wenn ich versuche, die Anwendung von JAR-Datei ausführen bekomme ich diese AusnahmeMaven-Verpackung fehlgeschlagen Lucene, SPI existiert nicht Ausnahme

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 

Es gibt ein ähnliches Problem here, aber die Lösung mit Maven-Schatten-Plugin nicht helfen. Hier sind pom.xml verwandte Segmente.

<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> 

Das Problem ist, dass es aus irgendeinem Grund versucht, etwas von Lucene50 zu laden.

Jede Hilfe ist wertvoll!

+0

hi Ich frage mich nur, ob Sie dieses Problem gelöst haben, als ich das gleiche Problem bekam – Ziqi

+0

Ich bin auch auf dieses Problem - jede Lösung? – Ralph

Antwort

1

Also das ist meine Lösung dieses Problems (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> 
` 

Dateien org.apache.lucene.codecs.Codec, org.apache.lucene.codecs.DocValuesFormat, org.apache.lucene.codecs. PostingsFormat enthält Informationen zu Codecs, die im Projekt verwendet werden. Sie sollten in das Verzeichnis META-INF/services gestellt werden (sollte erstellt werden, wenn es nicht existiert). In meinem Fall war das Problem in mehreren postingFormats, Codecs und DocValuesFormats, ich habe sie in die Dateien eingefügt und das Problem wurde gelöst.

Beispiel org.apache.lucene.codecs.Codec Datei:

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 

Beispiel org.apache.lucene.codecs.DocValuesFormat Datei:

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

Beispiel von org.apache.lucene.codecs.PostingsFormat Datei:

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 

In Ihrem Fall sollten Sie das gleiche für Lucene50 tun.