Node.jsからJavaのAPIを使う
node-javaを使って、Node.jsからJavaでコンパイルされたAPIを利用する方法です。
事前準備
- OpenJDK(11以上)をインストールする
- 環境変数
JAVA_HOME
を追加する
OpenJDKのインストールは下の記事を参考にしてください。
OpenJDKのインストールと実行方法
インストール時のみOpenJDK11以上が必要です。jdk1.6ではエラーとなります。
実行時はJAVA_HOMEが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が終らない場合の対処方法
windows-build-toolsが終らない場合の対処方法
使い方
JavaのAPIを同期で実行したい場合は各APIの末尾にSync
を付けてコールします。
インスタンスメソッドのコール
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
をコンパイルして作成したものです。
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メソッド(クラスメソッド)のコール
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
をコンパイルして作成したものです。
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()
を使用します