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
BINDING
GROOVYCLASSLOADER

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


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


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


                                                            Class
GROOVYSCRIPTENGINE

GroovyScript
   Engine    GroovyScriptEngine(String[] roots)


            .loadScriptByName(String)                      Class


            .run(String, Binding)                          Object

                                        Script
            .createScript(String)                 .run()
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
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

Similar to Come Incorporare un Interprete Groovy in Java

Distribuire una libreria Java per usarla come dipendenza gradle
Distribuire una libreria Java per usarla come dipendenza gradleDistribuire una libreria Java per usarla come dipendenza gradle
Distribuire una libreria Java per usarla come dipendenza gradle
Paolo Montalto
 
Introduzione a WebGL
Introduzione a WebGLIntroduzione a WebGL
Introduzione a WebGL
nigerpunk
 
Techbar nodejs+mongodb+mongoose
Techbar nodejs+mongodb+mongooseTechbar nodejs+mongodb+mongoose
Techbar nodejs+mongodb+mongoose
Massimo Biagioli
 
Sencha touch: panoramica e orientamento sul codice
Sencha touch: panoramica e orientamento sul codiceSencha touch: panoramica e orientamento sul codice
Sencha touch: panoramica e orientamento sul codice
Giuseppe Toto
 
Livin' with Docker - dallo sviluppo alla produzione
Livin' with Docker - dallo sviluppo alla produzioneLivin' with Docker - dallo sviluppo alla produzione
Livin' with Docker - dallo sviluppo alla produzione
giacomos
 
node.js e Postgresql
node.js e Postgresqlnode.js e Postgresql
node.js e Postgresql
Lucio Grenzi
 
Applicazioni native in java
Applicazioni native in javaApplicazioni native in java
Applicazioni native in java
Federico Paparoni
 
Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacyTommaso Torti
 
Java SE 5. Capitolo 01: Base
 Java SE 5. Capitolo 01: Base Java SE 5. Capitolo 01: Base
Java SE 5. Capitolo 01: Base
bobpuley
 
Javascript task automation
Javascript task automationJavascript task automation
Javascript task automationDotNetCampus
 
Javascript task automation
Javascript task automationJavascript task automation
Javascript task automation
Antonio Liccardi
 
JAVASCRIPT TASK AUTOMATION
JAVASCRIPT TASK AUTOMATIONJAVASCRIPT TASK AUTOMATION
JAVASCRIPT TASK AUTOMATION
DotNetCampus
 
Jug 30 10 04 Jdo
Jug 30 10 04 JdoJug 30 10 04 Jdo
Jug 30 10 04 Jdo
Massimiliano Dessì
 
RESTful APIs (ITA) - /w WebMachine
RESTful APIs (ITA) - /w WebMachineRESTful APIs (ITA) - /w WebMachine
RESTful APIs (ITA) - /w WebMachine
Giancarlo Valente
 
[Luca Cracco] - DevOps: strumenti di automazione per Drupal8
[Luca Cracco] - DevOps: strumenti di automazione per Drupal8[Luca Cracco] - DevOps: strumenti di automazione per Drupal8
[Luca Cracco] - DevOps: strumenti di automazione per Drupal8
Wellnet srl
 
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
DrupalDay
 
#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2
Dominopoint - Italian Lotus User Group
 
Javascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il webJavascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il web
Roberto Messora
 
Building Large Java Codebase with Bazel - CodeOne
Building Large Java Codebase with Bazel - CodeOneBuilding Large Java Codebase with Bazel - CodeOne
Building Large Java Codebase with Bazel - CodeOne
Natan Silnitsky
 

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

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

More from Paolo Predonzani

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

More from Paolo Predonzani (7)

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

Come Incorporare un Interprete Groovy in Java

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n