目前nodejs調用jar主要有兩種方式:
- 通過創建子進程運行java -jar命令調用包含main方法的jar
- 使用node-java通過c++橋接調用jar
方法一(子進程運行):
const { spawn } = require('child_process');
const child = spawn('java', ['-jar', `${__dirname}/Main.jar`]);
child.stdout.on('data', (data) => {
console.log(`child stdout: ${data}`)
});
child.stderr.on('data', (data) => {
console.error(`stderror ${data}`);
});
child.on('exit', function(code, signal){
console.log('child process exited with' + `code ${code} and signal ${signal}`);
});
在makefile文件目錄下執行make打包Main.jar
.
├── Main.java
├── makefile
└── manifest.txt
makefile
JFLAGS = -g
JC = javac
JAR = jar
JARFLAGS = cvfe
.SUFFIXES: .java .class .jar
.java.class:
$(JC) $(JFLAGS) $*.java
.class.jar:
$(JAR) $(JARFLAGS) Main.jar Main *.class
CLASSES = \
Main.java
default: jar
classes: $(CLASSES:.java=.class)
jar: $(CLASSES:.java=.jar)
clean:
$(RM) *.class
$(RM) *.jar%
manifest.txt
Main-Class: Main%
Main.java
package com.lablelan;
public class Hello {
public static void main(String[] args) {
System.out.println("hello world");
}
}
輸出結果:
child stdout: hello world
child process exited withcode 0 and signal null
方法二(通過c++橋接):
var java = require('java');
var javaLangSystem = java.import('java.lang.System');
var num = java.newLong(100);
// 函數以Sync結尾會運行在v8主線程
javaLangSystem.out.printlnSync('Hello World');
// 函數不帶Sync將會運行在v8的非主線程的工作線程
num.toString((err, data)=>{
console.log("data: ", data)
})
// process.exit(0);
安裝環境
# 注意這里需要有java8環境,如果報錯找不到./build/jvm_dll_path.json可以執行node_modules/java/postInstall.js生成
# 出現安裝問題可以參考 https://github.com/joeferner/node-java
npm install -g node-gyp
npm install java
輸出結果
Hello World
data: 100
下一篇將提供一個事例項目及結合簡單的源碼分析對node-java進行詳細講解