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
index 67365cf999..5ac4768865 100644
--- a/java-groovy-joint/pom.xml
+++ b/java-groovy-joint/pom.xml
@@ -27,6 +27,7 @@
Groovy Bintray
https://dl.bintray.com/groovy/maven
+
never
diff --git a/java-groovy-joint/src/main/groovy/com.baeldung/CalcScript.groovy b/java-groovy-joint/src/main/groovy/com.baeldung/CalcScript.groovy
deleted file mode 100644
index 2278f0dab8..0000000000
--- a/java-groovy-joint/src/main/groovy/com.baeldung/CalcScript.groovy
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.baeldung
-
-import org.slf4j.LoggerFactory
-
-abstract class CalcScript extends Script {
- def log = LoggerFactory.getLogger(this.getClass())
-
- def calcSum(x, y) {
- log.info "Executing $x + $y"
- x + y
- }
-
- 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/CalcMath.groovy b/java-groovy-joint/src/main/groovy/com/baeldung/CalcMath.groovy
similarity index 76%
rename from java-groovy-joint/src/main/groovy/com.baeldung/CalcMath.groovy
rename to java-groovy-joint/src/main/groovy/com/baeldung/CalcMath.groovy
index d9709653c7..0e233793b2 100644
--- a/java-groovy-joint/src/main/groovy/com.baeldung/CalcMath.groovy
+++ b/java-groovy-joint/src/main/groovy/com/baeldung/CalcMath.groovy
@@ -10,6 +10,12 @@ class CalcMath {
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!!!
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
index 0a201d12e2..7cfeba2024 100644
--- a/java-groovy-joint/src/main/java/com/baeldung/App.java
+++ b/java-groovy-joint/src/main/java/com/baeldung/App.java
@@ -1,12 +1,20 @@
package com.baeldung;
-import groovy.lang.Binding;
-import groovy.lang.GroovyClassLoader;
-import groovy.lang.GroovyShell;
+import groovy.lang.*;
+import groovy.util.GroovyScriptEngine;
+import groovy.util.ResourceException;
+import groovy.util.ScriptException;
import org.codehaus.groovy.control.CompilerConfiguration;
+import org.codehaus.groovy.jsr223.GroovyScriptEngineFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.script.Compilable;
+import javax.script.ScriptEngine;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
/**
* Hello world!
*
@@ -15,40 +23,84 @@ 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 App() {
+ private App() throws IOException {
loader = new GroovyClassLoader(this.getClass().getClassLoader());
CompilerConfiguration config = new CompilerConfiguration();
config.setScriptBaseClass("com.baeldung.CalcScript");
shell = new GroovyShell(loader, new Binding(), config);
+ engine = new GroovyScriptEngine(new URL[] { new File("src/main/groovy/com/baeldung/").toURI().toURL() }, this.getClass().getClassLoader());
}
- private void runScript(int x, int y) {
- Object script = shell.parse(String.format("calcSum(%d,%d)", x, y));
+ private void runCompiledClasses(int x, int y) {
+ Object result1 = new CalcScript().calcSum(x, y);
+ LOG.info("Result of calcSum() method is {}", result1);
+
+ Object result2 = new CalcMath().calcSum(x, y);
+ LOG.info("Result of calcSum() method is {}", result2);
+ }
+
+ private void runShellScript(int x, int y) {
+ Script script = shell.parse(String.format("calcSum(%d,%d)", x, y));
assert script instanceof CalcScript;
- Object result = ((CalcScript) script).run();
+ Object result = script.run();
LOG.info("Result of run() method is {}", result);
Object script2 = shell.parse("CalcScript");
+ assert script2 instanceof CalcScript;
Object result2 = ((CalcScript) script2).calcSum(x + 7, y + 7);
LOG.info("Result of calcSum() method is {}", result2);
+ Script script3 = shell.parse("");
+ assert script3 instanceof CalcScript;
+ Object result3 = script3.invokeMethod("calcSum", new Object[] { x + 14, y + 14 });
+ LOG.info("Result of run() method is {}", result3);
+
}
- private void runClass(int x, int y) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
+ private void runClassWithLoader(int x, int y) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Class calcClass = loader.loadClass("com.baeldung.CalcMath");
Object calc = calcClass.newInstance();
assert calc instanceof CalcMath;
Object result = ((CalcMath) calc).calcSum(x, y);
LOG.info("Result is {}", result);
+
+ Object result2 = ((GroovyObject) calc).invokeMethod("calcSum", new Object[] { x + 14, y + 14 });
+ LOG.info("Result is {}", result2);
+
}
- public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
+ private void runClassWithEngine(int x, int y) throws ClassNotFoundException, IllegalAccessException, InstantiationException, ResourceException, ScriptException {
+
+ Class calcClass = engine.loadScriptByName("CalcMath.groovy");
+ GroovyObject calc = calcClass.newInstance();
+ Object result = calc.invokeMethod("calcSum", new Object[] { x, y });
+ //WARNING the following will throw a ClassCastException
+ //((CalcMath)calc).calcSum(1,2);
+ LOG.info("Result is {}", result);
+ }
+
+ private void runClassWithEngineFactory(int x, int y) throws ClassNotFoundException, IllegalAccessException, InstantiationException, ResourceException, ScriptException, javax.script.ScriptException {
+ ScriptEngine engine = new GroovyScriptEngineFactory().getScriptEngine();
+ Class calcClass = (Class) ((Compilable) engine).compile("com.baeldung.CalcMath").eval();
+ Object calc = calcClass.newInstance();
+ Object result = ((CalcMath) calc).calcSum(1, 20);
+ LOG.info("Result is {}", result);
+ }
+
+ public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, ResourceException, ScriptException, IOException, javax.script.ScriptException {
App app = new App();
+ LOG.info("Running an already compiled groovy class instance...");
+ app.runCompiledClasses(5, 10);
LOG.info("Running a groovy script...");
- app.runScript(5, 10);
+ app.runShellScript(5, 10);
LOG.info("Running a groovy class...");
- app.runClass(1, 3);
+ app.runClassWithLoader(1, 3);
+ LOG.info("Running a groovy class using the engine...");
+ app.runClassWithEngine(10, 30);
+ LOG.info("Running a groovy class using the engine factory...");
+ app.runClassWithEngineFactory(10, 30);
}
}