JVMでNode.jsを実行する

企業全体が1つのテクノロジープロバイダーに依存していた時代は終わりました。 小規模な企業やアマチュアでさえ、1つのプロジェクトでテクノロジーを組み合わせることで、自分自身に最適なソリューションを見つけます。 長い間、Javaはサーバーテクノロジーのリーダーでした。 しかし、今日Node.jsはどこにでもあります。













しかし、Node.jsとJavaScriptの人気が高まっても、Javaの力は失われません。 さらに、プラットフォーム全体をJVMからNode.jsに移行する余裕のある組織はほとんどありません。 つまり、企業は現在のテクノロジースタックを引き続き使用するか、ネットワークAPIを介して通信する複数のスタックを起動する必要があります。 ただし、別の方法があります:Node.jsをJVMプロセスで直接実行します。 そして、J2V8はついにそれを可能にしました。







J2v8









J2V8は、Java用のV8コネクターのセットです。 J2V8は、V8を動的ライブラリとしてパックし、Java Native Interface(JNI)を介してV8用のJava APIを提供します。 J2V8では、RhinoまたはNashornを使用しているかのように、V8を使用してJavaScriptを実行できます。







当初、J2V8は、クロスプラットフォームモバイルライブラリであるTabris.jsで高性能JavaScriptを提供するように設計されていました。







過去数か月にわたって、Node.jsのアセンブリを動的ライブラリとして構成し、そのためのJava APIとの対話を提供しました。 Node.jsのスクリプトをJavaから直接実行できるようになりました。 他のエンジンを使用してNode.jsを実装しようとする他のソリューションとは異なり、これはすべてのバグと機能を備えた実際のNode.jsです。 Node.jsはJVMと同じプロセスで起動し、すべての対話はJNIを介して同期的に発生します。







Node.jsとJVMの共有



J2V8は、Node.jsでスクリプトを実行したり、JavaからJavaScript関数を呼び出したり、その逆を行ったり、NPMモジュールを接続したり、Node.jsメッセージキューを開始したりするためのAPIを提供します。 すべてのNode.jsカーネルモジュールも存在します。







JVMでNode.jsを実行すると、大規模なJavaスタックを使用しているがNode.jsの使用を開始したい人は移行が容易になります。 たとえば、Node.jsでサーバー(Express.jsなど)を実行し、既存のJavaメソッドを呼び出して要求を処理できます。







static String NODE_SCRIPT = "var http = require('http');\n" + "" + "var server = http.createServer(function (request, response) {\n" + " response.writeHead(200, {'Content-Type': 'text/plain'});\n" + " response.end(someJavaMethod());\n" + "});\n" + "" + "server.listen(8000);\n" + "console.log('Server running at http://127.0.0.1:8000/');"; public static void main(String[] args) throws IOException { final NodeJS nodeJS = NodeJS.createNodeJS(); JavaCallback callback = new JavaCallback() { public Object invoke(V8Object receiver, V8Array parameters) { return "Hello, JavaWorld!"; } }; nodeJS.getRuntime().registerJavaMethod(callback, "someJavaMethod"); File nodeScript = createTemporaryScriptFile(NODE_SCRIPT, "example"); nodeJS.exec(nodeScript); while(nodeJS.isRunning()) { nodeJS.handleMessage(); } nodeJS.release(); }
      
      





NPM



Node.jsから既存のJavaメソッドを呼び出すことに加えて、J2V8はJavaからJavaScript関数(NPMモジュールを含む)を直接呼び出す機能を提供します。 この統合により、JavaユーザーはすぐにJVMで直接NPMモジュールの使用を開始できます。 たとえば、jimpを使用してJavaで画像を処理できます。







 public static void main(String[] args) { final NodeJS nodeJS = NodeJS.createNodeJS(); final V8Object jimp = nodeJS.require(new File("path_to_jimp_module")); V8Function callback = new V8Function(nodeJS.getRuntime(), new JavaCallback() { public Object invoke(V8Object receiver, V8Array parameters) { final V8Object image = parameters.getObject(1); executeJSFunction(image, "posterize", 7); executeJSFunction(image, "greyscale"); executeJSFunction(image, "write", "path_to_output"); image.release(); return null; } }); executeJSFunction(jimp, "read", "path_to_image", callback); while(nodeJS.isRunning()) { nodeJS.handleMessage(); } callback.release(); jimp.release(); nodeJS.release(); }
      
      





J2V8接続



Node.jsとの統合は、J2V8(バージョン4.4.0)ですでに利用可能です。 Windows(32ビットおよび64ビット)、MacOSおよびLinux(64ビット)で使用できます。 Pavenで次の依存関係を使用してMaven Centralから取得します(この例はWindows 64向けです。他のプラットフォームと交換することを忘れないでください)。







 <dependency> <groupId>com.eclipsesource.j2v8</groupId> <artifactId>j2v8_win32_x86_64</artifactId> <version>4.4.0</version> </dependency>
      
      





翻訳者から



J2V8は新しいレベルの抽象化を提供するため、プロジェクト全体の個々のタスクに最適なテクノロジーを選択できます。 開発者として、私は常にJavaの信頼性とNode.jsの便利さに魅了されてきました。 そして、すぐに、両方の長所を組み合わせたプロジェクトの成功例が見られることを願っています。








All Articles