ClassNotFoundException: org.elasticsearch.plugins.NetworkPlugin

原文:https://blog.csdn.net/u010882234/article/details/74941954 

最近在做接口服務的項目,用的是微服務架構spring cloud,主要是基於spring boot,使用idea構建真的很方便。離線數據搜索服務,使用的是Elasticsearch,版本5.2.0。在使用過程中,不太順利,建立client連接一直失敗,最後發現是spring boot的原因,得到了解決。
          Elasticsearch和Solr都是搜索引擎,在java項目中使用,非常方便,查詢效率也很高。Elasticsearch支持分佈式部署,支持全文搜索。具體的使用方式我還未完全掌握,我在項目中的角色是服務接口的開發,關於Elasticsearch,就是使用它檢索數據。

          作爲程序員,使用不熟悉的知識技能去完成開發任務,是基本技能吧。先在網上查找Elasticsearch的資料,查看別人的使用經驗。Elasticsearch使用有2種方式,可以使用HTTP調用,也可以建立client連接使用。由於後期服務量會比較大,決定採用建立client連接的方式查詢。首先使用了org.elasticsearch:5.2.2的jar不可以。之後問了下同事,他的工作是數據處理,建索存儲,他已經正常使用了。把他的使用方式拿了過來,org.elasticsearch.client:5.2.2版本的jar包,還是不行,非常詭異。

         由於同事已經正常使用,我就感覺是我這邊的問題,只好打斷點,排查代碼了。首先是報這個錯誤,報錯1:Unsupported major.minor version 52.0,經過網上搜索,發現是jdk版本過低的問題,1.7都不行。注意:elasticsearch5.2版本,只能用jdk1.8及以上。

        第一個問題解決後,繼續報錯。報錯2:找不到NetworkPlugin。這個問題在同事那兒是沒問題的,繼續排查,發現報錯是發生在創建client時,new PreBuiltTransportClient時報錯。點進去後這個類發現,它不在elasticsearch-5.2.2.jar中,卻在elasticsearch-2.4.4.jar中,當然找不到NetworkPlugin了。排除了其他因素,發現是受到了spring boot框架的影響。spring boot自身集成了Elasticsearch,如果沒有在pom文件裏直接引用elasticsearch-5.2.2,它會默認使用低版本的elasticsearch。本來考慮使用spring boot整合的elasticsearch,但是它支持的版本比較低,不適用於我們的情況。

        報錯2:找不到NetworkPlugin

Exception in thread "main" java.lang.NoClassDefFoundError: org/elasticsearch/plugins/NetworkPlugin
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.elasticsearch.transport.client.PreBuiltTransportClient.<clinit>(PreBuiltTransportClient.java:84)
    at com.iflytek.ocp.utils.ElasticSearchUtil.init(ElasticSearchUtil.java:107)
    at com.iflytek.ocp.adapter.AdapterApplication.init(AdapterApplication.java:325)
    at com.iflytek.ocp.adapter.AdapterApplication.main(AdapterApplication.java:38)
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.plugins.NetworkPlugin
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 16 more


         報錯3:ES日誌打印的問題,必須加上org.apache.logging.log4j的包。

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/Level
    at org.elasticsearch.common.logging.ESLoggerFactory.<clinit>(ESLoggerFactory.java:38)
    at org.elasticsearch.common.logging.Loggers.getLogger(Loggers.java:105)
    at org.elasticsearch.common.logging.Loggers.getLogger(Loggers.java:72)
    at org.elasticsearch.common.component.AbstractComponent.<init>(AbstractComponent.java:37)
    at org.elasticsearch.plugins.PluginsService.<init>(PluginsService.java:98)
    at org.elasticsearch.client.transport.TransportClient.newPluginService(TransportClient.java:99)
    at org.elasticsearch.client.transport.TransportClient.buildTemplate(TransportClient.java:124)
    at org.elasticsearch.client.transport.TransportClient.<init>(TransportClient.java:258)
    at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(PreBuiltTransportClient.java:125)
    at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(PreBuiltTransportClient.java:111)
    at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(PreBuiltTransportClient.java:101)
    at com.iflytek.ocp.utils.ElasticSearchUtil.init(ElasticSearchUtil.java:107)
    at com.iflytek.ocp.adapter.AdapterApplication.init(AdapterApplication.java:325)
    at com.iflytek.ocp.adapter.AdapterApplication.main(AdapterApplication.java:38)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.Level
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)


            總結:1、JDK1.8及以上;2、不僅要使用org.elasticsearch.client包,也要使用elasticsearch-5.2.2包;3、使用org.apache.logging.log4j日誌包

            pom文件,maven引用:

<!--elasticsearch -->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>5.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>5.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.7</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.7</version>
        </dependency>


         Elasticsearch中文教程推薦:https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章