3.0.0-rc.2 • Published 6 months ago

nodejs-jre v3.0.0-rc.2

Weekly downloads
-
License
MIT
Repository
github
Last release
6 months ago

nodejs-jre

Nodejs-jre 可以从开源镜像网站下载 Java 运行时环境(JRE)或 Java 开发工具包(JDK)嵌入你的 node.js 应用并提供使用方法。

当前支持的 JRE、JDK 版本:8111718192021
当前支持的操作系统:windowsmacoslinuxalpine-linux

安装

npm install --save nodejs-jre

使用

安装 nodejs-jre,会自动下载 jre8。若这不是你想要的资源类型或版本,可调用 install API 下载对应资源。(同种资源类型的下载会进行覆盖,不同种的可以共存,例如:你不能同时拥有 jre8jre11,但你可以同时拥有 jre8jdk11

const { install } = require('nodejs-jre');

// 安装 jre17
install('jre', 17);

// 安装 jdk11,并在安装完成后输出:jdk11 安装成功
install('jdk', 11).then(() => {
    console.log('jdk11 安装成功');
});

需要注意的是,除 installnodejs-jre 的其他 API 都需要有对应资源才能使用。例如,要用 jre.java 就需确保安装 JRE,要用 jdk.javac 就需确保安装 JDK。

接下来我们通过 Java 的 “Hello World” 程序了解 nodejs-jre 的基本用法。首先我们在根目录下的 test 文件夹中准备一个原始的 Java 文件,test/Hello.java

public class Hello {
    public static void main(String[] args) {
        System.out.print("Hello " + args[0] + "!");
    }
}

通过运行如下代码,将 test/Hello.java 编译成 class 文件并运行。

const { jre, jdk } = require('nodejs-jre');

// 同步编译
jdk.javacSync('test/Hello.java');

// 异步运行并取得结果
let outcome = '';
const child = jre.java('Hello', ['-cp', 'test'], ['world']);

child.stdout.on('data', data => {
    outcome = data;
});
child.stderr.on('data', data => {
    console.log('Error: ' + data);
})
child.on('close', code => {
    console.log(outcome);   // Hello world!
})

API

Nodejs-jre 的 API 基本都是基于 child_process.spawnchild_process.spawnSync 的包装。除 install 外,所有 API 都提供同步和异步两个版本,它们拥有同样的参数,同步 API 具体可参考 child_process.spawnSync

install(driver, version, os)

异步下载指定版本的 JRE 或 JDK 集成到项目中去,该方法返回一个在集成完成后转为 fulfilledPromise。在 npm i nodejs-jre 时,会自动调用 install('jre', 8) 下载安装 jre8

若不指定 os 字段,默认会下载当前操作系统的 JRE 或 JDK。
❗ 要下载 alpine-linux 的资源,需要显示地制定 os 字段,否则默认会下载 linux 的资源。

参数:

  • driver {String} — 资源类型
    • 必填,仅支持 'jre''jdk'
  • version {Number} — 资源版本
    • 必填,目前仅支持 8111718192021
  • os {String} — 操作系统
    • 选填,仅支持 'windows''mac''linux''alpine-linux'

jre.java(sourceName, args, options)

加载指定的类或文件,运行 Java 程序。具体用法可参考官方文档

参数:

  • sourceName {String} — 要启动的类名或 jar 文件,需搭配不同的 args 使用
    • 必填,例如:'Hello''xxx.jar'
  • args {String[]} — java 使用的命令行选项
  • execArgs {String[]} — 传递给主类的参数
    • 选填,默认:[]
  • options {Object} — 传递给 child_process.spawnoptions 部分使用的选项
    • 选填,默认:{ detached: false }
    • 查看所有可使用的选项列表

该函数返回一个 ChildProcess 实例,用以处理进程的执行结果和错误信息,具体可参考 child_process.spawn

const { jre } = require('nodejs-jre');

/*** Some Examples ***/

// 合并父进程与子进程的环境变量,运行 Hello.class 文件
jre.java('Hello', ['-Dfile.encoding=UTF-8'], [], { env: ...process.env });  

// 运行 Test.jar 文件
jre.java('Test.jar', ['-Dfile.encoding=UTF-8', '-jar']);

// windows 中运行 a.jar 文件中的 org.xxx.yyy.ZZZ 类
// 同时传递 '12'、'34' 两个参数给它
jre.java('org.xxx.yyy.ZZZ', ['-Dfile.encoding=UTF-8', '-cp', ';.jar/a.jar'], ['12', '34']);  

jdk.javac(sourceFile, args)

读取 Java 类和接口定义,并将它们编译为字节码和类文件。具体用法可参考官方文档

参数:

  • sourceFile {String | String[]} — 一个或多个要编译的源文件,有多个时以数组形式传入
    • 必填,例如:'Hello.java'['Hello.java', 'World.java']
  • args {String[]} — javac 使用的命令行选项
    • 选填,默认:[]
    • 例如:['-d', 'test']
    • 查看所有可使用的选项列表
  • options {Object} — 传递给 child_process.spawnoptions 部分使用的选项
    • 选填,默认:{ encoding: 'utf8' }
    • 查看所有可使用的选项列表

该函数返回一个 ChildProcess 实例,用以处理进程的执行结果和错误信息,具体可参考 child_process.spawn

const { jdk } = require('nodejs-jre');

/*** Some Examples ***/

// 合并父进程与子进程的环境变量,编译 test 文件夹下的 Hello.java 文件
jdk.javac('test/Hello.java', [], { env: ...process.env });  

// 编译 test 文件夹下的 Hello.java 和当前目录下的 World.java 文件
// 在 class 文件夹下生成编译好的文件
jdk.javac(['test/Hello.java', 'World.java'], ['-d', 'class']);

扩展

如果你需要的命令不在现有 API 中,可以通过 jre.binjdk.bin 访问已安装的 JREJDKbin 目录进行扩展。

闲聊

作者 Duskstar,一个闲云野鹤般的前端攻城狮。偶尔玩玩开源项目,也偶尔写写博客

若对该项目有疑惑,或有心交流技术,不妨交个朋友🍻:

  • 微信 --- Duskstar01
  • 邮箱 --- duskstar@foxmail.com

人生难得,因缘际会,便随缘乐助留下 Star ⭐,不胜感激。

License

MIT Copyright (c) 2024 Duskstar

3.0.0-rc.2

6 months ago

3.0.0-rc

6 months ago

2.0.1

1 year ago

1.2.2

1 year ago

1.2.1

2 years ago

1.2.0

2 years ago

1.1.2

2 years ago

1.1.1

2 years ago

1.1.0

2 years ago

1.0.0

2 years ago