Elasticsearch

ElasticSearchで java.lang.ClassNotFoundExceptionが発生した場合の対応策

Spring BootとElasticsearchを連携したアプリケーションを作成中し、Document APIを叩いたところ、
java.lang.ClassNotFoundException: org.elasticsearch.common.xcontent.LoggingDeprecationHandler
が発生したので解決策をメモしておきます。

根本原因

エラーの内容の通り、原因はLoggingDeprecationHandlerというクラスが存在していないためですが、
なぜClassが存在しないかというと、依存性が不足しているからです。

当初mavenの依存性にはElasticsearchの依存性として次のように記述していました。

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.3.2</version>
        </dependency>

しかしこのorg.elasticsearch.clientにはLoggingDeprecationHandlerが含まれておらず、
正常動作のためにはorg.elasticsearchも依存性に含める必要がありました。

解決策

以下のようにpomファイルを修正することで、上記のExceptionが発生せずに動作させることができるようになりました。

        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.3.2</version>
        </dependency>

参考

Github: java.lang.ClassNotFoundException: org.elasticsearch.common.xcontent.NamedXContentRegistry #26959