【问题标题】:Solr bad return type errorSolr 错误的返回类型错误
【发布时间】:2015-08-19 20:55:12
【问题描述】:

我正在尝试使用基本的 Solr 教程,但遇到了一个我以前从未见过的错误,也无法找到有关在线的详细信息。

我的代码是:

import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.common.SolrInputDocument;

import java.io.IOException;

public class SolrjPopulator {
  public static void main(String[] args) throws IOException, SolrServerException {
    HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr");
    for(int i=0;i<1000;++i) {
      SolrInputDocument doc = new SolrInputDocument();
      doc.addField("cat", "book");
      doc.addField("id", "book-" + i);
      doc.addField("name", "The Legend of the Hobbit part " + i);
      server.add(doc);
      if(i%100==0) server.commit();  // periodically flush
    }
    server.commit(); 
  }
}

我得到的控制台错误是:

Exception in thread "main" java.lang.VerifyError: Bad return type
Exception Details:
  Location:
    org/apache/solr/client/solrj/impl/HttpClientUtil.createClient(Lorg/apache/solr/common/params/SolrParams;Lorg/apache/http/conn/ClientConnectionManager;)Lorg/apache/http/impl/client/CloseableHttpClient; @62: areturn
  Reason:
    Type 'org/apache/http/impl/client/DefaultHttpClient' (current frame, stack[0]) is not assignable to 'org/apache/http/impl/client/CloseableHttpClient' (from method signature)
  Current Frame:
    bci: @62
    flags: { }
    locals: { 'org/apache/solr/common/params/SolrParams', 'org/apache/http/conn/ClientConnectionManager', 'org/apache/solr/common/params/ModifiableSolrParams', 'org/apache/http/impl/client/DefaultHttpClient' }
    stack: { 'org/apache/http/impl/client/DefaultHttpClient' }
  Bytecode:
    0x0000000: bb00 0359 2ab7 0004 4db2 0005 b900 0601
    0x0000010: 0099 001e b200 05bb 0007 59b7 0008 1209
    0x0000020: b600 0a2c b600 0bb6 000c b900 0d02 00bb
    0x0000030: 0011 592b b700 124e 2d2c b800 102d b0 
  Stackmap Table:
    append_frame(@47,Object[#127])

            at org.apache.solr.client.solrj.impl.HttpSolrClient.<init>(HttpSolrClient.java:186)
            at org.apache.solr.client.solrj.impl.HttpSolrClient.<init>(HttpSolrClient.java:159)
            at org.apache.solr.client.solrj.impl.HttpSolrServer.<init>(HttpSolrServer.java:30)
            at com.coba.efx.news.server.SolrPopulator.main(SolrPopulator.java:14)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:483)
            at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

Process finished with exit code 1

此外,HttpSolrServer 类似乎已“弃用”。我不知道这到底是什么意思,但是有人可以告诉我问题是什么以及是否可以解决它?谢谢。

【问题讨论】:

  • 你能发布一个完整的依赖树的转储吗?另外,哪个是 Java 运行时?是安卓应用吗?

标签: java solr error-handling


【解决方案1】:

HttpSolrClient 有一个接受 HttpClient 的constructor。如果未通过,它会创建一个作为 CloseableHttpClient 的 internalClient。

因此您可以创建一个默认客户端并按如下方式传递它..

SystemDefaultHttpClient httpClient = new SystemDefaultHttpClient();
HttpSolrClient client = new HttpSolrClient(url, httpClient);

【讨论】:

  • 谢谢谢谢谢谢!我不知道为什么会这样,但它解决了我遇到的问题。
  • 很高兴我能帮上忙 :) 让我们将问题标记为已解决,以便其他人可以轻松找到它。
【解决方案2】:

在无法重现问题的情况下准确理解问题所在有点困难。无论如何,Solr 方法似乎返回了一个DefaultHttpClient,它不是CloseableHttpClient,这真的很奇怪,因为快速查看源代码表明事实上Default***Closeable***.

然而,这个跟踪是我们所拥有的:我猜你的项目对某个版本的 Apache httpclient 具有(直接或间接)依赖关系,该依赖关系与 Solr 编译时所针对的版本不兼容。您应该转储完整的依赖关系树并确保只有一个版本。

【讨论】:

  • 感谢@Raffaele 的反馈。你是什​​么意思完全转储依赖树?你是说罐子吗?顺便说一句,我没有使用 Maven。
  • 如果您没有使用依赖管理器,仍然尝试转储编译和运行类路径中的所有 JAR(也许 Intellij 在您运行项目时将类路径作为标准输出的第一行转储)
  • 如果你使用 maven 来管理你的项目。您可以使用以下命令:mvn dependency:tree。将这个输出重定向到一个文本文件中,找到不同版本的httpclient包。
  • 嗯,这是已知版本的 mishmash,请参见此处:issues.apache.org/jira/browse/SOLR-7948
【解决方案3】:

在类路径中使用更多版本的 httpclient 肯定有问题。 SolrJ 版本 6.6.0 也有同样的问题,所以我切换到版本 7.0.1 并得到另一个“版本”异常:

错误:实例

INFO mapreduce.Job: Task Id attempt_xzy, Status : FAILED
Error: INSTANCE

在纱线日志中:

ERROR [main] org.apache.hadoop.mapred.YarnChild: 
Error running child : java.lang.NoSuchMethodError:
org.apache.solr.client.solrj.impl.CloudSolrClient$Builder.withHttpClient(Lorg/shaded/apache/http/client/HttpClient;)Lorg/apache/solr/client/solrj/impl/SolrClientBuilder;

如果您使用的是 Maven,解决方案是使用 shade plugin 并像这样制作 fat jar:

         <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>
                        <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <manifestEntries>
                                    <Main-Class>${main.class.full.name}</Main-Class>
                                    <Build-Number>1.0</Build-Number>
                                </manifestEntries>
                            </transformer>
                        </transformers>
                          <relocations>
                            <relocation>
                                <pattern>org.apache.http</pattern>
                                <shadedPattern>org.shaded.apache.http</shadedPattern>
                            </relocation>
                        </relocations>
                    </configuration>
                </execution>
            </executions>
        </plugin>

注意事项:

1。 使集群类路径提供的所有其他依赖项都提供

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.7.1</version>
        <scope>provided</scope>
    </dependency>
  1. 如何查找版本问题:

    • yarn classpath
    • 回显 $HADOOP_CLASSPATH 或
    • find /usr/hdp/current -type f -name "*httpclient*"

你会看到这样的:

./hadoop/lib/httpclient-4.2.5.jar
./hadoop/lib/commons-httpclient-3.1.jar
./hadoop/lib/ranger-hdfs-plugin-impl/httpclient-4.5.2.jar
./ranger-hdfs-plugin/lib/ranger-hdfs-plugin-impl/httpclient-4.5.2.jar
./hadoop-yarn/lib/httpclient-4.2.5.jar
./hadoop-yarn/lib/commons-httpclient-3.1.jar

【讨论】:

    【解决方案4】:

    如果其他人出现此错误,可能是由于您的应用程序设置方式造成的,尤其是在您有多个引用项目的情况下。

    对我来说,每次我开始主项目时都会收到这个问题,但不知道为什么。 (查看构建路径上的jar文件):

    这些 jar 文件也被部署为部署程序集的一部分。我还有一个正在部署的引用项目。问题是这个引用的项目也部署了相同的 solr-6.6.1 jar 文件,从而导致出现错误。

    这是一个边缘案例,但希望它可以帮助某人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-08
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      相关资源
      最近更新 更多