solr 无法加载编码解码器'Lucene410'

czq61nw1  于 2022-11-05  发布在  Solr
关注(0)|答案(3)|浏览(127)

我尝试用我用Java编写的应用程序读取solr版本4的索引,我将此依赖项添加到我的ivy.xml文件中:

<dependency org="org.apache.lucene" name="lucene-core" rev="5.2.1">

</dependency>
<dependency org="org.apache.hadoop" name="hadoop-hdfs" rev="2.7.1"/>
<dependency org="org.slf4j" name="slf4j-jdk14" rev="1.7.7"/>
<dependency org="log4j" name="log4j" rev="1.2.17"/>
<dependency org="org.apache.lucene" name="lucene-backward-codecs" rev="5.2.1"/>

我创建了我的应用程序的jar文件,当我想运行应用程序时,它给予我这样的错误:

java.lang.IllegalArgumentException: Could not load codec 'Lucene410'.  Did you forget to add lucene-backward-codecs.jar?

Caused by: java.lang.IllegalArgumentException: An SPI class of type org.apache.lucene.codecs.Codec with name 'Lucene410' does not exist.  You need to add the corresponding JAR file supporting this SPI to your classpath.  The current classpath supports the following names: [Lucene50]

我用了这行代码:

System.out.println("codec path:" + Lucene410Codec.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());

它给予我路径到jar文件的编解码器jar,所以它存在。
更新:另外,在Eclipse中,我可以使用下面这行代码:

Codec.availableCodecs()

它给了我编解码器的列表,Lucene 410编解码器显示在列表中,但当我试图运行jar文件时却没有。
我在某个地方读到,我应该将这个codec jar文件的服务添加到我的build.xml中,但它不起作用,这是ant(build.xml)中我的jar部分:

<target name="jar" depends="compile" description="Creates the JAR file with a Main-Class.">
    <mkdir dir="${jar.dir}" />
    <copy file="conf/log4j.properties" todir="${classes.dir}" />

    <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
        <exclude name="**/org.apache.lucene.codecs.Codec"/>
        <zipgroupfileset dir="lib" includes="*.jar" />
        <manifest>
            <attribute name="Main-Class" value="${Main-Class}" />
            <attribute name="Class-Path" value=". ${jar.classpath}" />
        </manifest>
        <service type="org.apache.lucene.codecs.Codec">
            <provider classname="org.apache.lucene.codecs.lucene40.Lucene40Codec" />
            <provider classname="org.apache.lucene.codecs.lucene41.Lucene41Codec" />
            <provider classname="org.apache.lucene.codecs.lucene42.Lucene42Codec" />
            <provider classname="org.apache.lucene.codecs.lucene45.Lucene45Codec" />
            <provider classname="org.apache.lucene.codecs.lucene46.Lucene46Codec" />
            <provider classname="org.apache.lucene.codecs.lucene49.Lucene49Codec" />
            <provider classname="org.apache.lucene.codecs.lucene410.Lucene410Codec" />
            <provider classname="org.apache.lucene.codecs.lucene50.Lucene50Codec" />
        </service>  
    </jar>
</target>

这是我用来将lib文件夹中的jar文件添加到classpath中的class.path:

<path id="class.path">
    <fileset dir="lib">
        <include name="**/*.jar" />
    </fileset>

问题是lucene-core包在META-INF/services中有它自己的“org.apache.lucene.codecs.Codec”文件,它覆盖了我试图在构建文件的jar目标的“service”部分中创建的文件。build.xml中可见的exclude标记不起作用,zipgroupfileset上的exclude属性也不起作用。任何帮助都将非常感谢。

yeotifhr

yeotifhr1#

我可能会晚一点,但我所要做的就是添加lucene-backward-codecs.jar作为外部jar文件,可以在下载的zip文件中找到。

9jyewag0

9jyewag02#

不确定是什么问题。您可以尝试以下操作,创建一个jar,使其依赖于类路径。

<target name="jar" depends="compile" description="Creates the JAR file with a Main-Class.">
    <mkdir dir="${jar.dir}" />
    <copy file="conf/log4j.properties" todir="${classes.dir}" />

    <!-- Copy dependencies into the distribution directory -->
    <ivy:retrieve pattern="${jar.dir}/[artifact]-[revision](-[classifier]).[ext]"/>

    <!-- Create a manifest classpath property -->
    <manifestclasspath property="jar.classpath" jarfile="${jar.dir}/${ant.project.name}.jar">
       <classpath>
          <fileset dir="${jar.dir}" includes="*.jar"/>
       </classpath>
    </manifestclasspath>

    <!-- Create an executable jar -->
    <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
        <manifest>
            <attribute name="Main-Class" value="${Main-Class}" />
            <attribute name="Class-Path" value="${jar.classpath}" />
        </manifest>
    </jar>
</target>
polkgigr

polkgigr3#

我们在更新lucene依赖关系时遇到了这个问题。
或者,您也可以只删除在内部Exception指向的位置找到的持久化索引。对于我们来说,它位于:

Suppressed: org.apache.lucene.index.CorruptIndexException: checksum passed (6272597c). possibly transient resource issue, or a Lucene or JVM bug (resource=BufferedChecksumIndexInput(MMapIndexInput(path="C:\<path-to-app>\lucene\segments_a8")))

因为我们设置了属性roads.lucene.indexDirectoryPath=lucene

相关问题