无法加载编解码器'Lucene410'

时间:2015-12-22 18:25:48

标签: java solr ant lucene ivy

我正在尝试使用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-core软件包在META-INF / services中拥有自己的“org.apache.lucene.codecs.Codec”文件并覆盖了我试图在“服务”部分创建的文件构建文件中的jar目标。可以在build.xml中看到的exclude标记不起作用,zipgroupfileset上的exclude属性也不起作用。任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:0)

不确定问题是什么。你可以尝试以下方法,创建一个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>

答案 1 :(得分:0)

我可能迟到了。但是我要做的就是将lucene-backward-codecs.jar添加为外部jar文件,该文件可以在Downloaded zip文件中找到。