nodejs調用jar


目前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進行詳細講解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM