SlideShare a Scribd company logo
COME INCORPORARE UN
INTERPRETE GROOVY IN UN
    APPLICATIVO JAVA
    paolo.predonzani@manydesigns.com
Integrazione Java-Groovy


    Compilazione              Embedding
                       (caricamento a run-time)


    BSF e JSR 223          Embedding nativo




GroovyShell   GroovyClassLoader    GroovyScriptEngine
COMPILAZIONE
   MyClass.groovy                 MyClass.class

     Maven                           Ant




Joint compilation: Java referenzia Groovy e viceversa
BEAN SCRIPTING
      FRAMEWORK E JSR 223




http://commons.apache.org/bsf/
http://groovy.codehaus.org/Bean+Scripting+Framework
http://groovy.codehaus.org/JSR+223+Scripting+with+Groovy
EMBEDDING NATIVO
                                 GroovyScript
                                    Engine

                                    Script +
                  GroovyClass
                                  classpath +
                    Loader
                                   reload +
                  Introduce il   gestione delle
GroovyShell       concetto di     dipendenze
                    classpath
Semplici script
   isolati
DIETRO LE QUINTE...
GroovyShell                 GroovyScriptEngine


                      ScriptClassLoader

                                            gestione
                                          dipendenze


              GroovyClassLoader
GROOVYSHELL

GroovyShell
              .evaluate(String)                              Object


              .run(File, String[])                           Object

                                  Script
              .parse(File)
                                           .run()

                                           .invokeMethod()   Object
Come Incorporare un Interprete Groovy in Java
BINDING
GROOVYCLASSLOADER

GroovyClass
  Loader    .addClassPath(“/home/groovy”)


            .loadClass(“com.manydesigns.Pippo”)             Class


            .parseClass(“/home/groovy/com/manydesigns/Pippo.groovy”)


                                                            Class
Come Incorporare un Interprete Groovy in Java
GROOVYSCRIPTENGINE

GroovyScript
   Engine    GroovyScriptEngine(String[] roots)


            .loadScriptByName(String)                      Class


            .run(String, Binding)                          Object

                                        Script
            .createScript(String)                 .run()
Come Incorporare un Interprete Groovy in Java
SCRIPT == CLASSE
                                  Script


                         run()

def f() {}               main()

println “Hello world!”   f()
E’ COMODO GESTIRE
SCRIPT E CLASSI SEPARATAMENTE


                       }   Classpath, package, classi,
                           riuso, ingegneria


                       }   Script, file, utilizzo “spot”,
                           hacking


Groovy è groovy perché supporta entrambe le visioni!
GROOVY IN PORTOFINO 4
           Classpath per classi
           groovy comuni




           Groovy actions
Groovy actions:
  La struttura delle directory
  ricalca quella degli URL
  Un action.groovy per directory
  Non è richiesto package
  Si possono spostare/rinominare
  gli URL spostando/rinominando
  le directory
  Nessuno può dipendere da una
  action
  Non è richiesto refactoring
  Editabili via web o da IDE

  Ogni action.groovy è un mondo
  a sé. Lo trattiamo come script.
Groovy classpath:
  Un vero classpath con package
  e classi
  Contiene bean, classi di base
  per action, classi di utilità
  utilizzabili dalle action
  File tipicamente editati da IDE
  Refactoring

  Classpath groovy, simile ad un
  classpath Java ma editabile
  dinamicamente
CLASS LOADING

   ClassLoader        Carica solo classi Java

           parent
        classloader
GroovyClassLoader     Carica classi Java e Groovy
Questo è il problema maggiore dell’embedding.
  Se Groovy fosse compilato, Java e Groovy
     vivrebbero nello stesso class loader.
CLASS LOADING: OGNL

OGNL: %{@org.example.MyGroovyClass@myMethod()}


   ... non funziona perché OGNL usa il classloader Java
            e non riesce a risolvere classi Groovy
CLASS LOADING: HIBERNATE
Da Groovy funziona:




Da Java funziona solo se si recupera Book dal
GroovyClassLoader
PRESTAZIONI:
CACHING E RELOADING

 Approccio dei test:
 1.“riscaldare i motori”
 2.misurare la prima esecuzione
 3.misurare la seconda esecuzione
 4.touch dello script
 5.misurare la terza esecuzione
Come Incorporare un Interprete Groovy in Java
PRESTAZIONI:
                CONCLUSIONI
                               Caching   Reloading

GroovyShell.evaluate(String)     No         --

   GroovyShell.run(File)         Sì        No

    GroovyClassLoader            Sì        No

    GroovyScriptEngine           Sì         Sì
RELOADING DIPENDENZE
       A
                   A dipende da B
                   B viene modificato
                   B viene ricaricato
       B
                   Anche A dovrebbe essere ricaricato


In teoria, ma fino a Groovy 1.8.8/2.0.4 c’era un bug:
http://jira.codehaus.org/browse/GROOVY-4975
RIFERIMENTI
http://groovy.codehaus.org/Embedding+Groovy

http://groovy.codehaus.org/The+groovyc+Ant+Task

http://docs.codehaus.org/display/GMAVEN/Home

http://groovy.codehaus.org/api/groovy/lang/GroovyShell.html

http://groovy.codehaus.org/api/groovy/lang/
GroovyClassLoader.html

http://groovy.codehaus.org/api/groovy/util/
GroovyScriptEngine.html
GRAZIE!
paolo.predonzani@manydesigns.com

  http://www.manydesigns.com/

More Related Content

PDF
NuIEEE - Workshop de Git
ODP
Docker jug taa
PDF
Embedding Groovy in a Java Application
PDF
Groovy for java developers
PPT
Sviluppo Rapido Di Applicazioni Con Grails
PDF
Groovy & Grails
PDF
Closure Visto Da Vicino
PDF
introduzione a symfony 2
NuIEEE - Workshop de Git
Docker jug taa
Embedding Groovy in a Java Application
Groovy for java developers
Sviluppo Rapido Di Applicazioni Con Grails
Groovy & Grails
Closure Visto Da Vicino
introduzione a symfony 2

Similar to Come Incorporare un Interprete Groovy in Java (20)

PDF
Distribuire una libreria Java per usarla come dipendenza gradle
PDF
Introduzione a WebGL
PDF
Techbar nodejs+mongodb+mongoose
PDF
Sencha touch: panoramica e orientamento sul codice
PPTX
Livin' with Docker - dallo sviluppo alla produzione
PPT
node.js e Postgresql
PPT
Applicazioni native in java
PDF
App Engine + Python
PDF
Dominare il codice legacy
PDF
Java SE 5. Capitolo 01: Base
PPTX
JAVASCRIPT TASK AUTOMATION
PPTX
Javascript task automation
PPTX
Javascript task automation
PDF
Jug 30 10 04 Jdo
KEY
RESTful APIs (ITA) - /w WebMachine
PDF
[Luca Cracco] - DevOps: strumenti di automazione per Drupal8
PDF
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
PPT
#dd12 grillo daniele_xpages_tips_tricks_rev2
PPTX
Javascript avanzato: sfruttare al massimo il web
PDF
Building Large Java Codebase with Bazel - CodeOne
Distribuire una libreria Java per usarla come dipendenza gradle
Introduzione a WebGL
Techbar nodejs+mongodb+mongoose
Sencha touch: panoramica e orientamento sul codice
Livin' with Docker - dallo sviluppo alla produzione
node.js e Postgresql
Applicazioni native in java
App Engine + Python
Dominare il codice legacy
Java SE 5. Capitolo 01: Base
JAVASCRIPT TASK AUTOMATION
Javascript task automation
Javascript task automation
Jug 30 10 04 Jdo
RESTful APIs (ITA) - /w WebMachine
[Luca Cracco] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
#dd12 grillo daniele_xpages_tips_tricks_rev2
Javascript avanzato: sfruttare al massimo il web
Building Large Java Codebase with Bazel - CodeOne
Ad

More from Paolo Predonzani (7)

PDF
Wiki-like collaborative development for seamless customer involvement
PDF
How to put 100k lines of code into the (Google) cloud: storms and rainbows
PDF
Portofino 4: Creare Webapp da Database Esistenti in 30 Secondi
PDF
Come Incorporare un Interprete Groovy in un Applicativo Java
PDF
ODP
70k linee di codice, tangle architetturali e le sfide del refactoring
ODP
Model Driven Engineering - ManyDesigns Portofino
Wiki-like collaborative development for seamless customer involvement
How to put 100k lines of code into the (Google) cloud: storms and rainbows
Portofino 4: Creare Webapp da Database Esistenti in 30 Secondi
Come Incorporare un Interprete Groovy in un Applicativo Java
70k linee di codice, tangle architetturali e le sfide del refactoring
Model Driven Engineering - ManyDesigns Portofino
Ad

Come Incorporare un Interprete Groovy in Java

Editor's Notes