无法加载编解码器'Lucene410'



我正试图用我用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()

它给了我编解码器的列表,lucene410编解码器显示在列表中,但当我尝试运行jar文件时没有。

我在某个地方读到,我应该将这个编解码器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核心包在META-INF/services中有自己的"org.apache.locene.codecs.Codec"文件,它覆盖了我试图在构建文件中jar目标的"服务"部分创建的文件。build.xml中的exclude标记不起作用,zipgroupfileset上的exclude属性也不起作用。如有任何帮助,我们将不胜感激。

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

不确定问题出在哪里。您可以尝试以下操作,创建一个依赖类路径的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>

我们在更新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>lucenesegments_a8")))

因为我们设置了属性CCD_ 1。

相关内容

  • 没有找到相关文章

最新更新