<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shantanu Sharma</title>
    <description>The latest articles on DEV Community by Shantanu Sharma (@shantanu_sharma_57eefefe5).</description>
    <link>https://dev.to/shantanu_sharma_57eefefe5</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3676896%2F07926e03-6d95-42d4-9362-c8ccd40ac523.jpg</url>
      <title>DEV Community: Shantanu Sharma</title>
      <link>https://dev.to/shantanu_sharma_57eefefe5</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shantanu_sharma_57eefefe5"/>
    <language>en</language>
    <item>
      <title>Node4J — Call Java Code Natively from Node.js

https://dev.to/shantanu_sharma_57eefefe5/node4j-call-java-code-natively-from-nodejs-5dag</title>
      <dc:creator>Shantanu Sharma</dc:creator>
      <pubDate>Wed, 24 Dec 2025 13:31:46 +0000</pubDate>
      <link>https://dev.to/shantanu_sharma_57eefefe5/node4j-call-java-code-natively-from-nodejs-pod</link>
      <guid>https://dev.to/shantanu_sharma_57eefefe5/node4j-call-java-code-natively-from-nodejs-pod</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/shantanu_sharma_57eefefe5" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3676896%2F07926e03-6d95-42d4-9362-c8ccd40ac523.jpg" alt="shantanu_sharma_57eefefe5"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/shantanu_sharma_57eefefe5/node4j-call-java-code-natively-from-nodejs-5dag" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Node4J — Call Java Code Natively from Node.js&lt;/h2&gt;
      &lt;h3&gt;Shantanu Sharma ・ Dec 24&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#spark&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#node&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Node4J — Call Java Code Natively from Node.js</title>
      <dc:creator>Shantanu Sharma</dc:creator>
      <pubDate>Wed, 24 Dec 2025 12:29:50 +0000</pubDate>
      <link>https://dev.to/shantanu_sharma_57eefefe5/node4j-call-java-code-natively-from-nodejs-5dag</link>
      <guid>https://dev.to/shantanu_sharma_57eefefe5/node4j-call-java-code-natively-from-nodejs-5dag</guid>
      <description>&lt;h2&gt;
  
  
  🚀 Node4J: Call Java from Node.js Like Native JavaScript (Py4J for JS)
&lt;/h2&gt;

&lt;p&gt;Java has one of the richest ecosystems in software history.&lt;br&gt;
Node.js has one of the most productive developer experiences.&lt;/p&gt;

&lt;p&gt;But until now, bridging the two cleanly has been painful.&lt;/p&gt;

&lt;p&gt;That’s why I built Node4J — a modern, TypeScript-first JVM bridge for Node.js, inspired by Py4J, but designed for the JavaScript world.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/node4j" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/node4j&lt;/a&gt;&lt;br&gt;


&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://www.npmjs.com/package/node4j" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;npmjs.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




&lt;h3&gt;
  
  
  With Node4J, you can:
&lt;/h3&gt;

&lt;p&gt;Call Java objects as if they were JavaScript objects&lt;/p&gt;

&lt;p&gt;Execute Java JAR files directly from Node.js&lt;/p&gt;

&lt;p&gt;Manage JVM lifecycle using worker threads&lt;/p&gt;

&lt;p&gt;Build hybrid Java + Node systems without JNI or rewriting code&lt;/p&gt;

&lt;h3&gt;
  
  
  🤔 Why Node4J?
&lt;/h3&gt;

&lt;p&gt;If you’ve ever faced one of these situations, Node4J is for you:&lt;/p&gt;

&lt;p&gt;You have existing Java services or libraries and want to reuse them in Node.js&lt;/p&gt;

&lt;p&gt;You want to expose Java business logic to a modern Node API&lt;/p&gt;

&lt;p&gt;You want Py4J-like power, but for JavaScript&lt;/p&gt;

&lt;p&gt;You need robust JVM process management from Node.js&lt;/p&gt;

&lt;p&gt;You want type safety, async/await, and clean APIs&lt;/p&gt;

&lt;h3&gt;
  
  
  ✨ What Node4J Can Do
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Core Features
&lt;/h4&gt;

&lt;p&gt;🔌 Connect to a running JVM (GatewayServer)&lt;/p&gt;

&lt;p&gt;🧠 Interact with Java objects directly from Node.js&lt;/p&gt;

&lt;p&gt;⚙️ Execute Java JAR files from Node using worker threads&lt;/p&gt;

&lt;p&gt;🔁 Auto-restart JVM on crash&lt;/p&gt;

&lt;p&gt;🧵 Non-blocking JVM execution (Worker Threads)&lt;/p&gt;

&lt;p&gt;📡 Real-time stdout / stderr monitoring&lt;/p&gt;

&lt;p&gt;🧩 Fully async &amp;amp; Promise-based API&lt;/p&gt;

&lt;p&gt;🧪 TypeScript-first with typed events&lt;/p&gt;

&lt;p&gt;📦 Installation&lt;br&gt;
npm install node4j&lt;/p&gt;
&lt;h3&gt;
  
  
  🧠 How It Works (Conceptually)
&lt;/h3&gt;

&lt;p&gt;Node.js&lt;br&gt;
│&lt;br&gt;
├── Node4J Gateway (TypeScript)&lt;br&gt;
│&lt;br&gt;
├── Worker Thread&lt;br&gt;
│   └── JVM Process (java -jar ...)&lt;br&gt;
│&lt;br&gt;
└── Java GatewayServer (Py4J)&lt;/p&gt;
&lt;h3&gt;
  
  
  This design ensures:
&lt;/h3&gt;
&lt;h4&gt;
  
  
  JVM crashes don’t crash Node.js
&lt;/h4&gt;

&lt;p&gt;Heavy JVM logs don’t block the event loop&lt;/p&gt;

&lt;p&gt;Multiple JVMs can be managed safely&lt;/p&gt;
&lt;h3&gt;
  
  
  🚀 Option 1: Connect to an Existing Java Gateway
&lt;/h3&gt;

&lt;p&gt;Java Side (Server)&lt;/p&gt;

&lt;p&gt;Node4J uses Py4J on the Java side.&lt;/p&gt;

&lt;p&gt;Add dependency (Maven)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;net.sf.py4j&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;py4j&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;0.10.9.9&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sample Java App
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class SampleJavaNode {

    private Stack stack = new Stack();

    public Stack getStack() {
        return stack;
    }

    public static void main(String[] args) {
        GatewayServer server = new GatewayServer(new SampleJavaNode(), 25333);
        server.start();
        System.out.println("Gateway Server started on port 25333");
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Node.js Side (Client)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Gateway } from "node4j";

const myJava = new Gateway({
  host: "127.0.0.1",
  port: 25333,
});

const stack = await myJava.entryPoint.getStack();
await stack.push("Hello from Node.js");
console.log(await stack.pop());

const random = await myJava.jvm.java.util.Random();
console.log(await random.nextInt(10));

const system = await myJava.jvm.System;
console.log(await system.currentTimeMillis());
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💡 Yes — this is real Java code being executed.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔥 Option 2: Execute Java JAR Files Directly from Node.js
&lt;/h3&gt;

&lt;p&gt;This is where Node4J goes beyond Py4J.&lt;/p&gt;

&lt;p&gt;🧵 WorkerJarExecutor (Production-Grade JVM Launcher)&lt;/p&gt;

&lt;p&gt;Node4J includes a WorkerJarExecutor, which:&lt;/p&gt;

&lt;p&gt;Runs JVM in a worker thread&lt;/p&gt;

&lt;p&gt;Detects when the JAR is “ready”&lt;/p&gt;

&lt;p&gt;Restarts JVM on crash&lt;/p&gt;

&lt;p&gt;Streams logs safely&lt;/p&gt;

&lt;p&gt;Prevents zombie processes&lt;/p&gt;

&lt;h4&gt;
  
  
  Example: Launch a JAR from Node.js
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Gateway, WorkerJarExecutor } from "node4j";

const executor = new WorkerJarExecutor();

await executor.start({
  jarPath: "sampleJavaNode-1.0-SNAPSHOT.jar",
  javaOpts: ["-Xmx512m"],
  readySignal: "Gateway Server started on port 25333",
  timeoutMs: 5000,
  restartOnCrash: true,
  maxRestarts: 3,
  onMessage: (message) =&amp;gt; {
    switch (message.type) {
      case "stdout":
        console.log(message.args);
        break;
      case "stderr":
        console.error(message.args);
        break;
      case "ready":
        console.log("JVM is ready");
        break;
    }
  },
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once started, you can connect using Gateway as usual.&lt;/p&gt;

&lt;h4&gt;
  
  
  📡 Typed Worker Events (TypeScript-First)
&lt;/h4&gt;

&lt;p&gt;Node4J uses typed event messages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type WorkerMessage =
  | { type: "stdout"; args: string }
  | { type: "stderr"; args: string }
  | { type: "exit"; args: string }
  | { type: "shutdown"; args: string }
  | { type: "ready"; args: string };
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you:&lt;/p&gt;

&lt;p&gt;IDE autocomplete&lt;/p&gt;

&lt;p&gt;Exhaustive switch checks&lt;/p&gt;

&lt;p&gt;Safer production code&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 Why This Is Powerful
&lt;/h2&gt;

&lt;p&gt;Compared to Alternatives&lt;br&gt;
Approach    Problems&lt;br&gt;
REST / HTTP Serialization overhead&lt;br&gt;
JNI Unsafe, complex&lt;br&gt;
CLI execution   Hard to manage lifecycle&lt;br&gt;
node-java   JVM embedded, harder to isolate&lt;/p&gt;

&lt;h4&gt;
  
  
  Node4J gives you:
&lt;/h4&gt;

&lt;p&gt;✅ Isolation&lt;br&gt;
✅ Safety&lt;br&gt;
✅ Scalability&lt;br&gt;
✅ Familiar JS APIs&lt;br&gt;
✅ Production readiness&lt;/p&gt;

&lt;h3&gt;
  
  
  🧭 Use Cases
&lt;/h3&gt;

&lt;p&gt;🏢 Enterprise Java + Node microservices&lt;/p&gt;

&lt;p&gt;🔄 Gradual migration from Java to Node&lt;/p&gt;

&lt;p&gt;📊 Analytics / ML Java libraries from Node&lt;/p&gt;

&lt;p&gt;🖥️ Desktop apps (Electron + JVM)&lt;/p&gt;

&lt;p&gt;⚡ High-performance JVM compute from JS&lt;/p&gt;

&lt;h3&gt;
  
  
  🛣 Roadmap
&lt;/h3&gt;

&lt;p&gt;JVM Worker Pool (multiple JVMs)&lt;/p&gt;

&lt;p&gt;Autoscaling JVM executors&lt;/p&gt;

&lt;p&gt;Health metrics (CPU, RAM, GC)&lt;/p&gt;

&lt;p&gt;Distributed JVM execution&lt;/p&gt;

&lt;p&gt;Cloud-native orchestration&lt;/p&gt;

&lt;h3&gt;
  
  
  ❤️ Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Node4J brings Py4J-level JVM power to the JavaScript ecosystem, with modern Node.js design principles.&lt;/p&gt;

&lt;p&gt;If you work with Java + Node, this library can save you months of effort.&lt;/p&gt;

&lt;p&gt;👉 GitHub: &lt;a href="https://github.com/umbrashia/node4j" rel="noopener noreferrer"&gt;https://github.com/umbrashia/node4j&lt;/a&gt;&lt;br&gt;
👉 npm: npm install node4j&lt;/p&gt;

&lt;p&gt;If you like the idea, I’d love feedback, issues, and contributions.&lt;br&gt;
Let’s bridge the JVM and JavaScript worlds 🌉&lt;/p&gt;

</description>
      <category>spark</category>
      <category>java</category>
      <category>node</category>
    </item>
  </channel>
</rss>
