Node.jsからJavaのAPIを使う

node-javaを使って、Node.jsからJavaでコンパイルされたAPIを利用する方法です。

事前準備

  1. OpenJDK(11以上)をインストールする
  2. 環境変数JAVA_HOMEを追加する

OpenJDKのインストールは下の記事を参考にしてください。

OpenJDKのインストールと実行方法
インストール時のみOpenJDK11以上が必要です。jdk1.6ではエラーとなります。
実行時はJAVA_HOMEがjdk1.6でも問題ありません。

java(node-java)のインストール

npm install java

Windowsでインストールエラーが発生する場合、管理者モードでPowerShellを起動してから、次のコマンドを実行してください。

npm install --global --production windows-build-tools
2021.06.26 上記コマンドが完了しないことがあるため、その対処方法を記載しました。
windows-build-toolsが終らない場合の対処方法

使い方

JavaのAPIを同期で実行したい場合は各APIの末尾にSyncを付けてコールします。

インスタンスメソッドのコール

app.js
const java = require('java');
java.classpath.push("sampleLib.jar");
java.classpath.push("commons-lang3-3.1.jar");
java.classpath.push("commons-io.jar");

// Syncを使って実行.
const list1 = java.newInstanceSync("java.util.ArrayList");
console.log("list1.size=" + list1.sizeSync());

const instance1 = java.newInstanceSync("com.samplelib.SampleClass");
instance1.printSync("instance1");
console.log("instance1:" + instance1.getIntSync());

console.log("-----");

// コールバックで実行.
java.newInstance("java.util.ArrayList", (err, list2) => {
    // 後から実行される.
    if (err) { console.error(err); return; }

    console.log("list2.size=" + list2.sizeSync());
});

java.newInstance("com.samplelib.SampleClass", (err, instance2) => {
    // 後から実行される.
    if (err) { console.error(err); return; }
    instance2.printSync("instance2");
    console.log("instance2:" + instance2.getIntSync());
});

console.log("*****");

// クラスをインポートして実行.
const ArrayList = java.import('java.util.ArrayList');
const list3 = new ArrayList();
console.log("list3.size=" + list3.sizeSync());

const SampleClass = java.import('com.samplelib.SampleClass');
const instance3 = new SampleClass();
instance3.printSync("instance3");
console.log("instance3:" + instance3.getIntSync());

console.log("EOF");

sampleLib.jarは次のSampleClass.javaをコンパイルして作成したものです。

SampleClass.java
package com.samplelib;

public class SampleClass {
    public SampleClass() {
    }

    public void print(String s) {
        System.out.println(s);
    }

    public int getInt() {
        return 100;
    }
}

実行結果

>node app.js
list1.size=0
instance1
instance1:100
-----
*****
list3.size=0
instance3
instance3:100
EOF
instance2
instance2:100
list2.size=0
  • コールバックで実行の部分は実行ごとに順番が変わります
  • printSync()print()とした場合、順番が変わります
  • getInt()ではコールできません

staticメソッド(クラスメソッド)のコール

app.js
const java = require('java');
java.classpath.push("sampleLib.jar");

// クラスをインポートして実行.
const SampleStatic = java.import('com.samplelib.SampleStatic');
SampleStatic.print("no sync");
console.log(SampleStatic.getIntSync());

console.log("-----");

SampleStatic.printSync("instance sync");

console.log("EOF");

sampleLib.jarは次のSampleStatic.javaをコンパイルして作成したものです。

SampleStatic.java
package com.samplelib;

public class SampleStatic {
    public SampleStatic() {
    }

    public static void print(String s) {
        System.out.println("(static)" + s);
    }

    public static int getInt() {
        return 1999;
    }
}

実行結果

>node app.js
1999
-----
(static)instance sync
(static)no syncEOF
  • print()でコールした場合、順番が変わります
  • 同期処理で実行したい場合はprintSync()を使用します
このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です