Java ElasticSearch 2.2.0-ESIntegTestCase-在搜索中执行groovy脚本时ClassNotFoundException
我一直在使用弹性1.4.4,但现在我们正在升级到2.2.0。我在运行集成测试时遇到问题。我的集成测试扩展了Java ElasticSearch 2.2.0-ESIntegTestCase-在搜索中执行groovy脚本时ClassNotFoundException,java,
elasticsearch,groovy,Java,
elasticsearch,Groovy,我一直在使用弹性1.4.4,但现在我们正在升级到2.2.0。我在运行集成测试时遇到问题。我的集成测试扩展了org.elasticsearch.test.ESIntegTestCase: @ESIntegTestCase.ClusterScope(scope = ESIntegTestCase.Scope.SUITE, numDataNodes = 1) public abstract class AbstractApplicationTest extends ESIntegTestCase {
org.elasticsearch.test.ESIntegTestCase
:
@ESIntegTestCase.ClusterScope(scope = ESIntegTestCase.Scope.SUITE, numDataNodes = 1)
public abstract class AbstractApplicationTest extends ESIntegTestCase {
...
}
我可以毫无问题地为文档编制索引,但当我尝试使用脚本字段搜索时,会出现错误。我正在使用sbt运行测试(我正在使用Play框架)
我得到的错误如下:
{
"error": {
"root_cause": [{
"type": "script_exception",
"reason": "failed to compile groovy script"
}],
"type": "search_phase_execution_exception",
"reason": "all shards failed",
"phase": "query",
"grouped": true,
"failed_shards": [{
"shard": 0,
"index": "bokun",
"node": "BNyjts9hTOicRgCAWGdKgQ",
"reason": {
"type": "script_exception",
"reason": "Failed to compile inline script [if(_source.accumulated_availability != null){ for(item in _source.accumulated_availability){ if(start.compareTo(item.day) < 0 && (end == null || end.compareTo(item.day) >= 0)){ return item.day } }} else return null;] using lang [groovy]",
"caused_by": {
"type": "script_exception",
"reason": "failed to compile groovy script",
"caused_by": {
"type": "multiple_compilation_errors_exception",
"reason": "startup failed:\nCould not instantiate global transform class groovy.grape.GrabAnnotationTransformation specified at jar:file:/Users/ogg/.ivy2/cache/org.codehaus.groovy/groovy-all/jars/groovy-all-2.4.4-indy.jar!/META-INF/services/org.codehaus.groovy.transform.ASTTransformation because of exception java.lang.ClassNotFoundException: groovy.grape.GrabAnnotationTransformation\n\nCould not instantiate global transform class org.codehaus.groovy.ast.builder.AstBuilderTransformation specified at jar:file:/Users/ogg/.ivy2/cache/org.codehaus.groovy/groovy-all/jars/groovy-all-2.4.4-indy.jar!/META-INF/services/org.codehaus.groovy.transform.ASTTransformation because of exception java.lang.ClassNotFoundException: org.codehaus.groovy.ast.builder.AstBuilderTransformation\n\n2 errors\n"
}
}
}
}]
},
"status": 500
}
这是什么原因造成的?据我所知,我的类路径中有这样一个类:org.codehaus.groovy.ast.builder.AstBuilderTransformation
。
我的build.sbt中有以下依赖项:
"org.codehaus.groovy" % "groovy-all" % "2.4.4",
"com.carrotsearch.randomizedtesting" % "randomizedtesting-runner" % "2.3.0" % "test",
"org.apache.lucene" % "lucene-test-framework" % "5.4.1",
"org.elasticsearch" % "elasticsearch" % "2.2.0" % "test" classifier "tests" withSources(),
"org.elasticsearch" % "elasticsearch" % "2.2.0" withSources(),
"org.elasticsearch.plugin" % "analysis-icu" % "2.2.0" % "test",
"org.elasticsearch.module" % "lang-groovy" % "2.2.0" % "test"
…我的EsIntegTestCase扩展类中有以下内容:
@Override
protected Settings nodeSettings(int nodeOrdinal) {
return Settings.settingsBuilder()
.put(super.nodeSettings(nodeOrdinal))
.put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1)
.put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 1)
.put(Node.HTTP_ENABLED, true)
.put("script.groovy.sandbox.enabled", true)
.put("script.engine.groovy.inline.search", true)
.put("script.engine.groovy.inline.update", "true")
.put("script.inline", true)
.put("script.update", true)
.put("script.indexed", true)
.put("script.default_lang", "groovy")
.build();
}
@Override
protected Collection<Class<? extends Plugin>> nodePlugins() {
return pluginList(GroovyPlugin.class, AnalysisICUPlugin.class);
}
@覆盖
受保护的设置节点设置(int nodeOrdinal){
返回设置。settingsBuilder()
.put(超级节点设置(nodeOrdinal))
.put(IndexMetaData.SETTING_碎片的数量,1)
.put(IndexMetaData.SETTING\u复制副本的数量,1)
.put(已启用Node.HTTP_,true)
.put(“script.groovy.sandbox.enabled”,true)
.put(“script.engine.groovy.inline.search”,true)
.put(“script.engine.groovy.inline.update”,“true”)
.put(“script.inline”,true)
.put(“script.update”,true)
.put(“script.index”,true)
.put(“script.default_lang”,“groovy”)
.build();
}
@凌驾
受保护的收集现在已解决此问题
问题实际上是,这是一个作为ClassNotFoundException重新发布的SecurityException
按照上的说明,我创建了一个安全策略文件,并为以下类添加了权限:
grant {
permission org.elasticsearch.script.ClassPermission "java.lang.Class";
permission org.elasticsearch.script.ClassPermission "org.codehaus.groovy.*";
permission org.elasticsearch.script.ClassPermission "groovy.*";
permission org.elasticsearch.script.ClassPermission "java.lang.*";
permission org.elasticsearch.script.ClassPermission "java.util.*";
permission org.elasticsearch.script.ClassPermission "java.math.BigDecimal";
permission org.elasticsearch.script.ClassPermission "org.joda.time.*";
};
然后在命令行上通过安全策略文件启动测试:
-Djava.security.policy=security.policy
您可以在Elastic讨论论坛上看到帮助我达成此解决方案的帖子:添加stacktraceplease@Jens我没有真正的堆栈跟踪。我唯一的错误消息是嵌入在我从elasticsearch(如上粘贴)获得的错误JSON结果中:启动失败:无法实例化全局转换类groovy.grape.GrabAnnotationTransformation。。。由于异常,java.lang.ClassNotFoundException:groovy.grape.GrabAnnotationTransformation无法实例化全局转换类org.codehaus.groovy.ast.builder.AstBuilderTransformation,因为异常java.lang.ClassNotFoundException:org.codehaus.groovy.ast.builder.AstBuilderTransformation
grant {
permission org.elasticsearch.script.ClassPermission "java.lang.Class";
permission org.elasticsearch.script.ClassPermission "org.codehaus.groovy.*";
permission org.elasticsearch.script.ClassPermission "groovy.*";
permission org.elasticsearch.script.ClassPermission "java.lang.*";
permission org.elasticsearch.script.ClassPermission "java.util.*";
permission org.elasticsearch.script.ClassPermission "java.math.BigDecimal";
permission org.elasticsearch.script.ClassPermission "org.joda.time.*";
};