2015-08-20 2 views
0

Мы можем создать и запустить groovyscript во время выполнения с помощью кода нижеКак проверить заводной скрипт на наличие ошибок компиляции

import groovy.lang.GroovyClassLoader; 
import groovy.lang.GroovyObject; 

import java.io.File; 
import java.io.IOException; 

     // Create a String with Groovy code. 
     final StringBuilder groovyScript = new StringBuilder(); 
     groovyScript.append("class Sample {"); 
     groovyScript.append(" String sayIt() { return \"Groovy says: Cool jajaja\" }"); 
     groovyScript.append("}"); 



     GroovyClassLoader gcl = new GroovyClassLoader() 

     GroovyCodeSource codeSource = new GroovyCodeSource(groovyScript.toString(), "aa", GroovyShell.DEFAULT_CODE_BASE) 

     //GCL will check for enabled cache over code source and use sourceCache to cache code with name 
     def scriptClass = gcl.parseClass(codeSource) 
       def classInstance = scriptClass.newInstance() 

assert "Groovy says: Cool jajaja".equals(classInstance.sayIt()) 

Теперь предположим, что в коде выше, мы ввели ошибку и теперь приведенный выше код, как показано ниже:

import groovy.lang.GroovyClassLoader; 
import groovy.lang.GroovyObject; 

import java.io.File; 
import java.io.IOException; 

     // Create a String with Groovy code. 
     final StringBuilder groovyScript = new StringBuilder(); 
     groovyScript.append("class Sample {"); 
     groovyScript.append("jajaja"); 
     groovyScript.append(" String sayIt() { return \"Groovy says: Cool jajaja\" }"); 
     groovyScript.append("}"); 

     GroovyClassLoader gcl = new GroovyClassLoader() 

     GroovyCodeSource codeSource = new GroovyCodeSource(groovyScript.toString(), "aa", GroovyShell.DEFAULT_CODE_BASE) 

     //GCL will check for enabled cache over code source and use sourceCache to cache code with name 
     def scriptClass = gcl.parseClass(codeSource) 
       def classInstance = scriptClass.newInstance() 

assert "Groovy says: Cool jajaja".equals(classInstance.sayIt()) 

Обратите внимание: мы добавили «jajaja» в сценарий после объявления класса.

Что должно быть сделано здесь, чтобы знать, что у нашего скрипта есть ошибки компиляции и не удастся с отсутствием исключения MissingPropertyException или другим исключением.

Когда попробовать то же самое с groovyConsole, он ломает сценарий с следующее сообщение об ошибке

1 compilation error: 

unexpected token: jajaja at line: 1, column: 15 

Можно ли проверить сценарий на наличие ошибок компиляции, прежде чем запустить его? Добавление блока try catch не работало для меня для этого кода.

+1

Обернуть 'gcl.parseClass' в' try ... catch'? Не думаю, что я понимаю вопрос ... –

+0

Я согласен с Тимом, плохо понимаю, в чем проблема, и решение в порядке. catch MultipleCompilationErrorsException и, вероятно, CompilationFailedException –

+0

Вы не можете проверить, что что-то не получится, что не существует. Класс Sample не существует, пока вы не запустите скрипт. Вы спрашиваете, есть ли способ сказать «groovyScript» сказать вам, не сработает ли он первым? Я не уверен, что они купят вам, так как вам просто нужно запустить его в любом случае, чтобы зайти так далеко. – Gregg

ответ

0

GroovyShell работает хорошо, используя блок try-catch.

    GroovyCodeSource codeSource = new GroovyCodeSource(script, "aa", GroovyShell.DEFAULT_CODE_BASE) 

     //GCL will check for enabled cache over code source and use sourceCache to cache code with name 
     def scriptClass 
     try { 
      def shell = new GroovyShell() 
      def data = shell.parse(codeSource.scriptText) 
      data.run() 
     }catch (Throwable e){ 
      status = false 
     } 
     if(!status){ 
      return "domain.script.compilation.errors" 
     }else{ 
      return true 
     } 

Хотя один запасной вариант является то, что всякий раз, когда у вас есть код сценария, который является частичным и остальной части кода будут добавлены позже из другого сценария. Этот код не удастся, но это проблема разработчика, а не техническая.

Кроме того, это запустит скрипт, который может привести к плохим данным.

Смежные вопросы