简体   繁体   中英

Can't Get Elasticsearch Plugin to Work with Grails 3

I've tried to hook up Elasticsearch plugin ('org.grails.plugins:elasticsearch:1.4.1') with a Grails 3.1.9 project without any luck.

I've also uploaded a simple application in github to demonstrate the issue ( https://github.com/jackiebai/testEs )

The above sample testing app only has 1 domain class called Person :

class Person {
    String name
    static searchable = true
    static constraints = {
    }
}

The corresponding service class PersonService is used to save and index the Person data:

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)
    }
}

I've also added a couple of lines of code in the BootStrap.groovy so that some data will get inserted into the default hibernate db when the application starts:

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

The application.yml variable settings for the development environment look like below: environments: development: dataSource: dbCreate: create-drop url: jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE elasticSearch: client: mode: node transport.sniff: true bulkIndexOnStartup: true datastoreImpl: hibernateDatastore

Additional dependencies and bootRun code block were included in the build.gradle by following the plugin user guide ( http://noamt.github.io/elasticsearch-grails-plugin/docs/index.html )

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']
}

Unfortunately the application failed to run under my osx 10.11.6,java 1.8.0_91 environment with below errors:

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

According to documentation you should use v1.2.0

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

I believe version 1.4.1 is broken. You can try 2.4.0.RC1 with Grails 3.3+ but you need to add dependency to mapper-attachments and specify elasticsearch.version for Spring Boot:

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'
}

See issue#198

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM