我已成功导入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文件没有问题。
答案 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>