无法让 Elasticsearch 插件与 Grails 3 一起使用

Posted

技术标签:

【中文标题】无法让 Elasticsearch 插件与 Grails 3 一起使用【英文标题】:Can't Get Elasticsearch Plugin to Work with Grails 3 【发布时间】:2018-04-14 06:42:56 【问题描述】:

我尝试将 Elasticsearch 插件('org.grails.plugins:elasticsearch:1.4.1')与 Grails 3.1.9 项目连接起来,但没有任何运气。

我还在 github 上上传了一个简单的应用程序来演示这个问题 (https://github.com/jackiebai/testEs)

上述示例测试应用只有 1 个名为 Person 的域类:

class Person 
    String name
    static searchable = true
    static constraints = 
    

对应的服务类PersonService用于保存和索引Person数据:

import grails.transaction.Transactional
@Transactional
class PersonService 
    def addPerson(Person person)
        person.save()
        person.index()
    
    def addPerson(String name) 
        Person p = new Person(name:name)
        addPerson(p)
    

我还在 BootStrap.groovy 中添加了几行代码,以便在应用程序启动时将一些数据插入到默认的休眠数据库中:

class BootStrap 
    def personService
    def init =  servletContext ->
        personService.addPerson("Person One")
        personService.addPerson("John Smith")
    
    def destroy = 
    

开发环境的 application.yml 变量设置如下所示: 环境: 发展: 数据源: dbCreate:创建-删除 网址:jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE 弹性搜索: 客户: 模式:节点 运输嗅探:真 bulkIndexOnStartup: 真 datastoreImpl: hibernateDatastore

按照插件用户指南 (http://noamt.github.io/elasticsearch-grails-plugin/docs/index.html),build.gradle 中包含了其他依赖项和 bootRun 代码块

dependencies 
    ...
    compile 'org.grails.plugins:elasticsearch:1.4.1'
    compile 'org.elasticsearch:elasticsearch:5.4.1'
    ...

bootRun
    jvmArgs = ['-Des.path.home=/Users/myname/elasticsearch-5.4.1']

不幸的是,应用程序无法在我的 osx 10.11.6,java 1.8.0_91 环境下运行,并出现以下错误:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'elasticSearchClient': FactoryBean threw exception on object creation; nested exception is java.lang.NoClassDefFoundError: org/elasticsearch/mapper/attachments/MapperAttachmentsPlugin
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:175)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:103)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1590)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:317)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
    ... 34 common frames omitted
Caused by: java.lang.NoClassDefFoundError: org/elasticsearch/mapper/attachments/MapperAttachmentsPlugin
    at grails.plugins.elasticsearch.ClientNodeFactoryBean.getObject(ClientNodeFactoryBean.groovy:207)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168)
    ... 39 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.mapper.attachments.MapperAttachmentsPlugin
    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)
    ... 41 common frames omitted

【问题讨论】:

我在使用 Grails 3.3 和 Elasticsearch 插件 v2.4.0RC 时也遇到了这个问题。仍在寻找答案。 【参考方案1】:

根据文档,您应该使用 v1.2.0

https://github.com/noamt/elasticsearch-grails-plugin

【讨论】:

【参考方案2】:

我相信 1.4.1 版本已损坏。您可以使用 Grails 3.3+ 尝试 2.4.0.RC1,但您需要将依赖项添加到 mapper-attachments 并为 Spring Boot 指定 elasticsearch.version

ext['elasticsearch.version'] = '5.4.1'

dependencies 
    compile 'org.grails.plugins:elasticsearch:2.4.0.RC1'
    runtime 'org.elasticsearch.plugin:mapper-attachments:2.4.6'

见issue#198

【讨论】:

以上是关于无法让 Elasticsearch 插件与 Grails 3 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

CouchDB、Elastic Search 和 River 插件无法正常运行

laravel 5.5 elasticsearch/elasticsearch 插件安装及使用

elasticsearch安装插件:无法为对象堆保留足够的空间

ElasticSearch插件:“无法解析配置路径”错误

无法为 Elasticsearch-5.x 安装 Search Guard 插件

安装X-Pack插件之后Logstash无法连接Elasticsearch