2016-04-21 6 views
2

Я построил приложение Java для индексирования. Я использую Apache Lucene 5.3.1. Когда я запускаю приложение в среде IDE (IntelJ IDEA 2016.1.1 Community Edition), он работает нормально. Когда я пытаюсь запустить приложение из баночки файла я получаю это исключениеОшибка упаковки 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 (он должен быть создан, если не существует). В моем случае проблема была в нескольких postingFormats, 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 

Пример of org.apache.lucene.codecs.PostingsФормат файла:

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.