Java Addon V8 ✯ | PREMIUM |
public void arrayOperations() // Create JS array from Java V8Array jsArray = new V8Array(runtime); jsArray.push("item1"); jsArray.push("item2"); jsArray.push(42); jsArray.push(true);runtime.add("myArray", jsArray); // Process array in JS runtime.executeVoidScript(""" for(var i = 0; i < myArray.length; i++) console.log('Item ' + i + ': ' + myArray[i]); """); jsArray.close();public void convertJavaListToJSArray() List<String> javaList = Arrays.asList("A", "B", "C"); V8Array jsArray = new V8Array(runtime);
for (String item : javaList) jsArray.push(item); runtime.add("listFromJava", jsArray); jsArray.close();
public void registerCallback() runtime.registerJavaMethod((v8Object, v8Array) -> System.out.println("JavaScript called Java method!");// Access parameters if (v8Array.length() > 0) String param = v8Array.getString(0); System.out.println("Parameter: " + param); return "Response from Java"; , "javaCallback"); // Call from JS runtime.executeVoidScript("javaCallback('Hello from JS');");
<dependency>
<groupId>com.eclipsesource.j2v8</groupId>
<artifactId>j2v8</artifactId>
<version>6.2.0</version> <!-- Check for latest -->
<classifier>$os.dist</classifier> <!-- e.g., win32-x86_64, linux-x86_64 -->
</dependency>
Note: You need the correct classifier for your OS because V8 is native code.
import com.eclipsesource.v8.V8; import com.eclipsesource.v8.V8Object;public class CalculatorAddon private V8 runtime;
public CalculatorAddon() runtime = V8.createV8Runtime(); setupCalculator(); private void setupCalculator() V8Object calculator = new V8Object(runtime); // Add methods calculator.registerJavaMethod((receiver, params) -> double a = params.getDouble(0); double b = params.getDouble(1); return a + b; , "add"); calculator.registerJavaMethod((receiver, params) -> double a = params.getDouble(0); double b = params.getDouble(1); return a - b; , "subtract"); calculator.registerJavaMethod((receiver, params) -> double a = params.getDouble(0); double b = params.getDouble(1); return a * b; , "multiply"); calculator.registerJavaMethod((receiver, params) -> double a = params.getDouble(0); double b = params.getDouble(1); if (b == 0) throw new ArithmeticException("Division by zero"); return a / b; , "divide"); runtime.add("calc", calculator); calculator.close(); public double evaluateExpression(String expression) String script = "calc." + expression; return runtime.executeDoubleScript(script); public void executeComplexScript() String script = """ var result = calc.add(10, 20); result = calc.multiply(result, 2); result = calc.subtract(result, 15); result = calc.divide(result, 5); result; """; double finalResult = runtime.executeDoubleScript(script); System.out.println("Complex calculation result: " + finalResult); public void close() if (runtime != null) runtime.close(); public static void main(String[] args) CalculatorAddon calc = new CalculatorAddon(); System.out.println("10 + 20 = " + calc.evaluateExpression("add(10, 20)")); System.out.println("100 - 30 = " + calc.evaluateExpression("subtract(100, 30)")); System.out.println("8 * 7 = " + calc.evaluateExpression("multiply(8, 7)")); System.out.println("100 / 4 = " + calc.evaluateExpression("divide(100, 4)")); calc.executeComplexScript(); calc.close();
// Simple execution public void executeScript() String jsCode = "var x = 10; var y = 20; x + y;"; int result = runtime.executeIntegerScript(jsCode); System.out.println("Result: " + result); // Output: 30
// Execute with return value public void executeWithReturn() String script = "function multiply(a, b) return a * b; multiply(5, 7);"; int result = runtime.executeIntegerScript(script); System.out.println("Multiplication: " + result); // Output: 35
| Issue | Solution |
|-------|----------|
| Memory leaks | Always call close() on V8Objects and V8Arrays |
| Thread safety | Create separate V8 runtime per thread |
| Type mismatches | Use appropriate getters (getString(), getInteger(), etc.) |
| Native library loading | Ensure correct native library for your OS is available | Java Addon V8
If you are using Maven, you would typically add the dependency for your specific platform. Note that because this involves native code, you must specify the architecture (e.g., j2v8_linux_x86_64 or j2v8_macosx_x86_64).
<dependency>
<groupId>com.eclipsesource.j2v8</groupId>
<artifactId>j2v8_macosx_x86_64</artifactId>
<version>4.6.0</version>
<scope>compile</scope>
</dependency>
While GraalVM’s GraalJS can run in interpreted mode, its true power emerges when using GraalVM’s Native Image or the Graal Compiler. It actually competes with V8, but for our keyword "Java Addon V8," developers often mean any high-performance JS engine. GraalJS supports a "V8 compatibility mode" (js.v8-compat=true).
Pros:
Cons: