Embedding Groovy in a Java Application


Published on

Published in: Technology

Embedding Groovy in a Java Application

  1. 1. EMBEDDING GROOVY IN A JAVA APPLICATION paolo.predonzani@manydesigns.com
  2. 2. Java-Groovy integration Compiling Embedding (loading at run-time) BSF and JSR 223 Native embeddingGroovyShell GroovyClassLoader GroovyScriptEngine
  3. 3. COMPILING MyClass.groovy MyClass.class Maven AntJoint compilation: Java references Groovy and vice versa
  4. 4. BEAN SCRIPTING FRAMEWORK AND JSR 223http://commons.apache.org/bsf/http://groovy.codehaus.org/Bean+Scripting+Frameworkhttp://groovy.codehaus.org/JSR+223+Scripting+with+Groovy
  5. 5. NATIVE EMBEDDING GroovyScript Engine Scripts + GroovyClass classpath + Loader reload + Introduces the dependencyGroovyShell concept of management classpathSimple isolated scripts
  6. 6. BEHIND THE SCENES...GroovyShell GroovyScriptEngine ScriptClassLoader dependency mgmt. GroovyClassLoader
  7. 7. GROOVYSHELLGroovyShell .evaluate(String) Object .run(File, String[]) Object Script .parse(File) .run() .invokeMethod() Object
  8. 8. BINDING
  9. 9. GROOVYCLASSLOADERGroovyClass Loader .addClassPath(“/home/groovy”) .loadClass(“com.manydesigns.Foo”) Class .parseClass(“/home/groovy/com/manydesigns/Foo.groovy”) Class
  10. 10. GROOVYSCRIPTENGINEGroovyScript Engine GroovyScriptEngine(String[] roots) .loadScriptByName(String) Class .run(String, Binding) Object Script .createScript(String) .run()
  11. 11. SCRIPT == CLASS Script run()def f() {} main()println “Hello world!” f()
  12. 12. IT MAKES SENSE TO DEAL WITHSCRIPTS AND CLASSES SEPARATELY } Classpath, packages, classes, reuse, engineering } Scripts, files, “spot” usage, hackingGroovy is groovy because it supports both perspectives!
  13. 13. GROOVY IN PORTOFINO 4 Classpath for common groovy classes Groovy actions
  14. 14. Groovy actions: URL structure same as directory structure One action.groovy per directory Packages are not required URL’s can be moved/renamed by moving/renaming the directories Nobody can depend on an action No refactoring is required Editable from browser or IDE Each action.groovy is self- contained. We treat it as a script.
  15. 15. Groovy classpath: A real classpath with packages and classes Contains beans, base classes for actions, utility classes invokable by actions Typically edited from an IDE Refactoring Groovy classpath: similar to a Java classpath but dynamically reloadable
  16. 16. CLASS LOADING ClassLoader Loads Java classes only parent classloaderGroovyClassLoader Loads Java & Groovy classes
  17. 17. This is the main problem of embedding.If Groovy was compiled, Java and Groovy would live in the same class loader
  18. 18. CLASS LOADING: OGNLOGNL: %{@org.example.MyGroovyClass@myMethod()}... does not work because OGNL uses the Java classloader and cannot resolve Groovy classes
  19. 19. CLASS LOADING: HIBERNATEIn Groovy this works:From Java it works only if we retrieve Book from theGroovyClassLoader
  20. 20. PERFORMANCE:CACHING & RELOADING Test strategy: 1. “engine warm up” 2. measure the first run 3. measure the second run 4. “touch” the script 5. measure the third run
  21. 21. PERFORMANCE: CONCLUSIONS Caching ReloadingGroovyShell.evaluate(String) No -- GroovyShell.run(File) Yes No GroovyClassLoader Yes No GroovyScriptEngine Yes Yes
  22. 22. DEPENDENCY RELOADING A A depends on B B is modified B is reloaded B Also A should be reloadedIn theory, but until Groovy 1.8.8/2.0.4 there was a bug:http://jira.codehaus.org/browse/GROOVY-4975
  23. 23. REFERENCEShttp://groovy.codehaus.org/Embedding+Groovyhttp://groovy.codehaus.org/The+groovyc+Ant+Taskhttp://docs.codehaus.org/display/GMAVEN/Homehttp://groovy.codehaus.org/api/groovy/lang/GroovyShell.htmlhttp://groovy.codehaus.org/api/groovy/lang/GroovyClassLoader.htmlhttp://groovy.codehaus.org/api/groovy/util/GroovyScriptEngine.html
  24. 24. THANK YOU!paolo.predonzani@manydesigns.com http://www.manydesigns.com/