发 帖  
原厂入驻New
[问答]

nodejs与java的互调用方法

53 nodejs java
分享
nodejs 与java的互调用方法很多,我们可选的是使用oracle 新的vm 引擎(graalvm很不错)
还有就是基于browserIFy进行包装,同时给java 提供一套require 的模式机制,但是对于原
生的nodejs 来说就有一些问题了,社区有人提供了一个基于jni的node 包装(但是安装不是
很方便)

0
2020-11-4 07:31:09   评论 分享淘帖 邀请回答
1个回答
试用


  • 安装jdk
    按照官方文档的说法,对于jdk9 支持有问题,推荐使用jdk8,同时需要安装jdk 不是jre
  • 试用
yarn init -y
yarn add java
参考代码:
app.js
var java = require('java');
var javaLangSystem = java.import('java.lang.System');
javaLangSystem.out.printf('Hello World %s/r/n',"dalongdemo");
外部依赖(三方jar文件处理)
对于三方jar包的处理我们需要添加classpath,可以通过shadow plugin 或者dependency 解决


  • 参考代码

"use strict";
var fs = require("fs");
var java = require("java");
var baseDir = "./target/dependency";
var dependencies = fs.readdirSync(baseDir);

dependencies.forEach(function(dependency){
   java.classpath.push(baseDir + "/" + dependency);
})

java.classpath.push("./target/classes");
java.classpath.push("./target/test-classes");

exports.getJavaInstance = function() {
   return java;
}
var java = require("java");
java.classpath.push("commons-lang3-3.1.jar");
java.classpath.push("commons-io.jar");

var list1 = java.newInstanceSync("java.util.ArrayList");
console.log(list1.sizeSync()); // 0
list1.addSync('item1');
console.log(list1.sizeSync()); // 1

java.newInstance("java.util.ArrayList", function(err, list2) {
list2.addSync("item1");
list2.addSync("item2");
console.log(list2.toStringSync()); // [item1, item2]
});

var ArrayList = java.import('java.util.ArrayList');
var list3 = new ArrayList();
list3.addSync('item1');
list3.equalsSync(list1); // true
运行效果


使用node-java-maven管理依赖



  • 添加依赖node-java-maven


yarn add  node-java-maven


  • 添加代码依赖

"java": {
"dependencies": [
   {
     "groupId": "org.apache.lucene",
     "artifactId": "lucene-core",
     "version": "4.9.0"
   }
  ]
}



  • 下载依赖

./node_modules/.bin/node-java-maven



  • 代码使用

var java = require('java');
var mvn = require('node-java-maven');
mvn(function(err, mvnResults) {
   if (err) {
     return console.error('could not resolve maven dependencies', err);
   }
   mvnResults.classpath.forEach(function(c) {
       java.classpath.push(c);
       console.log(c)
       var Version = java.import('org.apache.lucene.util.Version');
   console.log(Version)
   });
});




  • 运行效果




说明

推荐使用docker或者linux 系统进行安装部署(windows 以及mac 问题比较多),对于依赖管理基于node-java-maven 是一个不错的选择
2020-11-4 11:18:31 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
我要提问
关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表