2016-03-06 92 views
2

我一直在使用Elastic 1.4.4,但我们现在升级到2.2.0。我无法让我的集成测试运行。我的集成测试扩展org.elasticsearch.test.ESIntegTestCaseElasticSearch 2.2.0 - ESIntegTestCase - 当在搜索中执行groovy脚本时出现ClassNotFoundException

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

我会重新格式化 “理性” 消息可读性:

startup failed: 

Could 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 

Could 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 

这是什么原因?据我所知,我在我的课程路径中有这个课程: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); 
} 

我完全被卡住,而谷歌是不愿意帮助! :slight_smiling:

任何帮助或指针将不胜感激。

非常感谢, OGG

+0

添加stacktrace请 – Jens

+0

@Jens我没有真正的堆栈跟踪。我唯一的错误信息被嵌入的错误JSON结果我从elasticsearch得到(如上粘贴): 启动失败: 无法实例全球变换类,因为异常 的 groovy.grape.GrabAnnotationTransformation ... 抛出java.lang.ClassNotFoundException:groovy.grape.GrabAnnotationTransformation 无法实例全球变换类 org.codehaus.groovy.ast.builder.AstBuilderTransformation 因为异常抛出java.lang.ClassNotFoundException的:org.codehaus.groovy.ast。 builder.AstBuilderTransformation – OGG

回答

3

这是现在解决了。

问题是,这是一个SecurityException作为ClassNotFoundException重新抛出。

使用说明在https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-security.html我创建了一个安全策略文件,并添加下列类权限:

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讨论论坛上看到线索,帮助我达成此解决方案:https://discuss.elastic.co/t/2-2-0-esintegtestcase-classnotfoundexception-when-executing-groovy-script-in-search/43579

相关问题