从源代码构建lucene:Codec不存在

时间:2015-02-18 05:39:24

标签: java lucene classloader

我已成功导入Lucene来源并构建。 但是当我尝试使用任何Lucene类时,我得到了

A SPI class of type org.apache.lucene.codecs.Codec with name 'Lucene410' does not exist
The current classpath supports the following names: []

我试图通过

获取课程的路径
String path = Lucene410Codec.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath();

并且有正确的路径,所以错误的jar文件没有问题。

2 个答案:

答案 0 :(得分:1)

问题是我在导入项目时错过了META-INF文件夹。 我手动添加了META-INF / services文件夹及其内容 - 编解码器文件(我从lucene.core.jar获取)到源并配置了正确的构建路径。

add something to resources in eclipse

现在我可以和Lucene合作了。

答案 1 :(得分:1)

对于那些面临这样问题的人,我有另一个看似体面的解决方案。发生此类问题的主要原因是某些JAR文件(在本例中为Lucene)提供了某些接口的实现,并附带了“META-DATA / service'目录。然后,此目录将接口映射到其实现类,以供服务定位器查找。因此,解决方案是重新定位这些实现类的类名,并将同一接口的多个实现合并到一个服务条目中。

Maven的shade插件提供了一个名为ServiceResourceTransformer的资源转换器,它可以执行此类重定位。所以在实践中我会按如下方式定义插件:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>2.4.3</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <filters>
          <filter>
            <artifact>*:*</artifact>
            <excludes>
              <exclude>META-INF/*.SF</exclude>
              <exclude>META-INF/*.DSA</exclude>
              <exclude>META-INF/*.RSA</exclude>
            </excludes>
          </filter>
        </filters>
        <transformers>
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>main.class.of.your.app.MainClass</mainClass>
          </transformer>
          <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
        </transformers>
      </configuration>
    </execution>
  </executions>
</plugin>