es4x 使用了graalvm 作为运行时环境,所以即拥有vertx 的强大,又拥有了与java 代码便捷的通信能力
以下是一个简单的测试,同时也简单说明下es4x 的es4x-launcher.jar 的生成
简单jar 包
使用maven 构建,没有什么特殊的
- pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dalong.nodeapi</groupId>
<artifactId>nodejsapi</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<encoding>UTF-8</encoding>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<distributionManagement>
<repository>
<id>github</id>
<name>GitHub OWNER Apache Maven Packages</name>
<url>https://maven.pkg.github.com/rongfengliang/es4x-userlogin-deploy</url>
</repository>
</distributionManagement>
</project>
- 代码
src/main/java/com.dalong/UserLogin.java
package com.dalong;
public class UserLogin {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private String name;
private int age;
public String token(String name,String password) {
return String.format("%s--%s",name,password);
}
}
- 构建jar包
mvn clean package
es4x 项目
使用cli 工具创建的简单web 项目
- 项目结构
├── README.md
├── app.sh
├── index.js
├── index.ts
├── nodejsapi-1.0-SNAPSHOT.jar
├── package-lock.json
├── package.json
├── tsconfig.json
└── yarn.lock
- 代码说明
index.js 通过typescript 编译的文件
index.ts 基于typescript 编写的入口
/// <reference path="node_modules/@types/es4x.d.ts" />
import { Router } from '@vertx/web';
// call jvm build in typee
const BigInteger =Java.type("java.math.BigInteger")
const app = Router.router(vertx);
// call custom type
const UserLogin = Java.type("com.dalong.UserLogin")
app.route('/').handler((ctx) => {
let msg = BigInteger.valueOf(10).pow(100)
// create new instance
let userlogin = new UserLogin();
// call instance method
let token = userlogin.token("dalong","appdemo")
ctx.response().end(`Hello from Vert.x Web! ${msg} \r\n---${token}`);
});
vertx.createHttpServer()
.requestHandler(app.handle)
.listen(8090);
- pacakge.json
{
"version": "1.0.0",
"description": "This is a ES4X empty project.",
"main": "index.js",
"scripts": {
"test": "es4x test index.test.js",
"postinstall": "es4x install",
"build": "tsc -w",
"start": "es4x -cp=:./"
},
"keywords": [],
"author": "",
"license": "ISC",
"name": "es4x-app",
"devDependencies": {
"@vertx/unit": "^3.8.3",
"typescript": "^3.7.2"
},
"dependencies": {
"@vertx/core": "^3.8.3",
"@vertx/web": "^3.8.3"
}
}
- 安装依赖
注意此处是核心,因为es4x 是在npm 的post 阶段调用了es4x install 然后生成运行时环境的jar 文件
jar 文件制定了class-path 对于不是系统自己的,或者安装标准es4x 开发的额npm 是无法添加到的
yarn
- 删除es4x-launcher.jar 手工生成包含自己jar class path 配置
rm -rf node_modules/.bin/es4x-launcher.jar node_modules/.bin/es4x-launcher
// -v 代表有自己的jar
es4x install -v nodejsapi-1.0-SNAPSHOT.jar
- 运行es4x 应用
注意需要copy 自己的jar 文件到node_modules/.lib 文件夹,后边会详细说明
yarn start
- 效果
yarn start
yarn run v1.19.1
$ es4x
Succeeded in deploying verticle
- 访问
curl -i http://localhost:8090
es4x-launcher.jar 文件说明
es4x-launcher.jar 文件是调用代码,生成的,默认生成的jar清单文件如下
如果需要三方依赖主要就是claa path, 目录文件.lib 放自己的jar 包 也没有用,所以打包带入可以使用-v 参数
如下为带-v 生成的jar 清单文件
install 简单说明
- 生成jar install方法
artifacts 获取方法
- npm 包格式
- 方法暴露
说明
从以上代码也可以看出来主要还是npm包暴露pacakge.json 中定义的mvn 依赖,然后调用maven 的依赖解析,处理依赖的构件
实际上我们也可以自己基于此模式,开发符合标准的npm 包,这样就可以不用使用自定义参数依赖jar了,这样可以无缝的与nodejs
环境集成
参考资料
https://sourcegraph.com/github.com/reactiverse/es4x/-/blob/pm/src/main/java/io/reactiverse/es4x/commands/Install.java#L174:5
https://github.com/reactiverse/es4x