diff --git a/java-groovy-joint/gmavenplus-pom.xml b/java-groovy-joint/gmavenplus-pom.xml
new file mode 100644
index 0000000000..b34eeb292d
--- /dev/null
+++ b/java-groovy-joint/gmavenplus-pom.xml
@@ -0,0 +1,148 @@
+
+
+
+ 4.0.0
+ java-groovy-joint
+ 0.1.0-SNAPSHOT
+ java-groovy-joint
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+ UTF-8
+ 3.9
+ 1.8
+ 3.8.1
+ 1.2.3
+ 2.5.7
+
+
+
+
+ bintray
+ Groovy Bintray
+ https://dl.bintray.com/groovy/maven
+
+ never
+
+
+ false
+
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+
+
+ org.codehaus.groovy
+ groovy-all
+ ${groovy.version}
+ pom
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 3.1.2
+
+
+
+ com.baeldung.App
+ true
+
+
+
+
+
+ org.codehaus.gmavenplus
+ gmavenplus-plugin
+ 1.7.0
+
+
+
+ execute
+ addSources
+ addTestSources
+ generateStubs
+ compile
+ generateTestStubs
+ compileTests
+ removeStubs
+ removeTestStubs
+
+
+
+
+
+ org.codehaus.groovy
+ groovy-all
+
+ 2.5.6
+ runtime
+ pom
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+ 3.1.0
+
+
+
+ jar-with-dependencies
+
+
+
+
+ com.baeldung.App
+
+
+
+
+
+
+ make-assembly
+
+ package
+
+ single
+
+
+
+
+
+
+
+
+
diff --git a/java-groovy-joint/pom.xml b/java-groovy-joint/pom.xml
new file mode 100644
index 0000000000..5ac4768865
--- /dev/null
+++ b/java-groovy-joint/pom.xml
@@ -0,0 +1,133 @@
+
+
+
+ 4.0.0
+ java-groovy-joint
+ 0.1.0-SNAPSHOT
+ java-groovy-joint
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+ UTF-8
+ 3.9
+ 1.8
+ 3.8.1
+ 1.2.3
+ 2.5.7
+
+
+
+
+ bintray
+ Groovy Bintray
+ https://dl.bintray.com/groovy/maven
+
+
+ never
+
+
+ false
+
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+
+
+ org.codehaus.groovy
+ groovy-all
+ ${groovy.version}
+ pom
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 3.1.2
+
+
+
+ com.baeldung.App
+ true
+
+
+
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+ groovy-eclipse-compiler
+ ${java.version}
+ ${java.version}
+
+
+
+ org.codehaus.groovy
+ groovy-eclipse-compiler
+ 3.3.0-01
+
+
+ org.codehaus.groovy
+ groovy-eclipse-batch
+ ${groovy.version}-01
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+ 3.1.0
+
+
+
+ jar-with-dependencies
+
+
+
+
+ com.baeldung.App
+
+
+
+
+
+
+ make-assembly
+
+ package
+
+ single
+
+
+
+
+
+
+
+
+
diff --git a/java-groovy-joint/src/main/groovy/com/baeldung/CalcMath.groovy b/java-groovy-joint/src/main/groovy/com/baeldung/CalcMath.groovy
new file mode 100644
index 0000000000..0e233793b2
--- /dev/null
+++ b/java-groovy-joint/src/main/groovy/com/baeldung/CalcMath.groovy
@@ -0,0 +1,25 @@
+package com.baeldung
+
+import org.slf4j.LoggerFactory
+
+class CalcMath {
+ def log = LoggerFactory.getLogger(this.getClass())
+
+ def calcSum(x, y) {
+ log.info "Executing $x + $y"
+ x + y
+ }
+
+ /**
+ * example of method that in java would throw error at compile time
+ * @param x
+ * @param y
+ * @return
+ */
+ def calcSum2(x, y) {
+ log.info "Executing $x + $y"
+ // DANGER! This won't throw a compilation issue and fail only at runtime!!!
+ calcSum3()
+ log.info("Logging an undefined variable: $z")
+ }
+}
\ No newline at end of file
diff --git a/java-groovy-joint/src/main/groovy/com/baeldung/CalcScript.groovy b/java-groovy-joint/src/main/groovy/com/baeldung/CalcScript.groovy
new file mode 100644
index 0000000000..688928468a
--- /dev/null
+++ b/java-groovy-joint/src/main/groovy/com/baeldung/CalcScript.groovy
@@ -0,0 +1,10 @@
+package com.baeldung
+
+def calcSum(x, y) {
+ x + y
+}
+
+def calcSum2(x, y) {
+ // DANGER! This won't throw a compilation issue and fail only at runtime!!!
+ calcSum3()
+}
diff --git a/java-groovy-joint/src/main/java/com/baeldung/App.java b/java-groovy-joint/src/main/java/com/baeldung/App.java
new file mode 100644
index 0000000000..c964d1c7cd
--- /dev/null
+++ b/java-groovy-joint/src/main/java/com/baeldung/App.java
@@ -0,0 +1,102 @@
+package com.baeldung;
+
+import groovy.lang.*;
+import groovy.util.GroovyScriptEngine;
+import groovy.util.ResourceException;
+import groovy.util.ScriptException;
+import org.codehaus.groovy.jsr223.GroovyScriptEngineFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.script.ScriptEngine;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.URL;
+
+/**
+ * Hello world!
+ *
+ */
+public class App {
+ private final static Logger LOG = LoggerFactory.getLogger(App.class);
+ private final GroovyClassLoader loader;
+ private final GroovyShell shell;
+ private final GroovyScriptEngine engine;
+ private final ScriptEngine engineFromFactory;
+
+ private App() throws IOException {
+ loader = new GroovyClassLoader(this.getClass().getClassLoader());
+ shell = new GroovyShell(loader, new Binding());
+ engine = new GroovyScriptEngine(new URL[] {
+ new File("src/main/groovy/com/baeldung/").toURI().toURL()
+ }, this.getClass().getClassLoader());
+ engineFromFactory = new GroovyScriptEngineFactory().getScriptEngine();
+ }
+
+ private void runCompiledClasses(int x, int y) {
+ LOG.info("Executing {} + {}", x, y);
+ Object result1 = new CalcScript().calcSum(x, y);
+ LOG.info("Result of CalcScript.calcSum() method is {}", result1);
+
+ Object result2 = new CalcMath().calcSum(x, y);
+ LOG.info("Result of CalcMath.calcSum() method is {}", result2);
+ }
+
+ private void runDynamicShellScript(int x, int y) throws IOException {
+ Script script = shell.parse(new File("src/main/groovy/com/baeldung/", "CalcScript.groovy"));
+ LOG.info("Executing {} + {}", x, y);
+ Object result = script.invokeMethod("calcSum", new Object[] { x, y });
+ LOG.info("Result of CalcScript.calcSum() method is {}", result);
+ }
+
+ private void runDynamicClassWithLoader(int x, int y) throws IllegalAccessException, InstantiationException, IOException {
+ Class calcClass = loader.parseClass(
+ new File("src/main/groovy/com/baeldung/", "CalcMath.groovy"));
+ GroovyObject calc = (GroovyObject) calcClass.newInstance();
+ Object result = calc.invokeMethod("calcSum", new Object[] { x + 14, y + 14 });
+ LOG.info("Result of CalcMath.calcSum() method is {}", result);
+ }
+
+ private void runDynamicClassWithEngine(int x, int y) throws IllegalAccessException, InstantiationException, ResourceException, ScriptException {
+
+ Class calcClass = engine.loadScriptByName("CalcMath.groovy");
+ GroovyObject calc = calcClass.newInstance();
+ //WARNING the following will throw a ClassCastException
+ //((CalcMath)calc).calcSum(1,2);
+ Object result = calc.invokeMethod("calcSum", new Object[] { x, y });
+ LOG.info("Result of CalcMath.calcSum() method is {}", result);
+ }
+
+ private void runDynamicClassWithEngineFactory(int x, int y) throws IllegalAccessException, InstantiationException, javax.script.ScriptException, FileNotFoundException {
+ Class calcClas = (Class) engineFromFactory.eval(
+ new FileReader(new File("src/main/groovy/com/baeldung/", "CalcMath.groovy")));
+ GroovyObject calc = (GroovyObject) calcClas.newInstance();
+ Object result = calc.invokeMethod("calcSum", new Object[] { x, y });
+ LOG.info("Result of CalcMath.calcSum() method is {}", result);
+ }
+
+ private void runStaticCompiledClasses() {
+ LOG.info("Running the Groovy classes compiled statically...");
+ runCompiledClasses(5, 10);
+
+ }
+
+ private void runDynamicCompiledClasses() throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException, ResourceException, ScriptException, javax.script.ScriptException {
+ LOG.info("Running a dynamic groovy script...");
+ runDynamicShellScript(5, 10);
+ LOG.info("Running a dynamic groovy class with GroovyClassLoader...");
+ runDynamicClassWithLoader(10, 30);
+ LOG.info("Running a dynamic groovy class with GroovyScriptEngine...");
+ runDynamicClassWithEngine(15, 0);
+ LOG.info("Running a dynamic groovy class with GroovyScriptEngine JSR223...");
+ runDynamicClassWithEngineFactory(5, 6);
+ }
+
+ public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, ResourceException, ScriptException, IOException, javax.script.ScriptException {
+ App app = new App();
+ app.runStaticCompiledClasses();
+ app.runDynamicCompiledClasses();
+ }
+}