Nodejs求助,想在nodejs里面调用一个java程序的函数,并返回结果。

Nodejs求助,想在nodejs里面调用一个java程序的函数,并返回结果。

网上搜了一下,感觉说的都不是很明白,哪位帅哥能给个例子吗?不胜感激!

10 回复

当然可以。在Node.js中调用Java程序的函数并获取结果,可以通过使用一些库来实现,比如 child_process 模块或者第三方库如 execacross-spawn。这里我将展示如何使用 child_process 模块来完成这个任务。

示例代码

首先,确保你的Java程序已经编译并且可以运行。假设你有一个简单的Java程序,名为 HelloWorld.java

// HelloWorld.java
public class HelloWorld {
    public static String sayHello(String name) {
        return "Hello, " + name;
    }
}

编译这个Java文件:

javac HelloWorld.java

然后,你可以创建一个Node.js脚本来调用这个Java方法:

const { execFile } = require('child_process');
const fs = require('fs');

// 创建一个临时的Java源文件
const javaSource = `
public class HelloWorld {
    public static String sayHello(String name) {
        return "Hello, " + name;
    }
}

public class Main {
    public static void main(String[] args) {
        if (args.length > 0) {
            System.out.println(HelloWorld.sayHello(args[0]));
        }
    }
}
`;

// 将Java源文件写入磁盘
fs.writeFileSync('Main.java', javaSource);

// 编译Java文件
execFile('javac', ['Main.java'], (error, stdout, stderr) => {
    if (error) {
        console.error(`执行错误: ${stderr}`);
        return;
    }

    // 执行编译后的Java程序
    execFile('java', ['Main', 'World'], (error, stdout, stderr) => {
        if (error) {
            console.error(`执行错误: ${stderr}`);
            return;
        }

        // 输出Java程序的结果
        console.log(`Java程序输出: ${stdout}`);
    });
});

解释

  1. 编写Java程序:我们定义了一个简单的Java类 HelloWorld,其中包含一个静态方法 sayHello,该方法接受一个字符串参数并返回问候语。

  2. 创建临时Java文件:在Node.js中,我们将Java源代码写入到一个临时文件 Main.java 中。

  3. 编译Java文件:使用 execFile 方法调用 javac 来编译Java文件。

  4. 执行Java程序:编译成功后,再次使用 execFile 方法来执行编译后的Java程序 Main,并将输入参数传递给它。

  5. 处理输出:从Java程序捕获输出并打印到Node.js控制台。

这种方法虽然简单,但在实际应用中可能需要更复杂的错误处理和资源管理。对于更复杂的应用场景,建议使用更高级的库或工具来简化这一过程。


这种进程间通信应该通过rest,mq等等方式来交互

嗯,不是进程间通信,就是nodej运行中调用已经写好的某个java程序的接口。好像npm install java这个模块就行,可是装的时候有点问题,然后require(‘java’)的时候提示出错。本人刚将开始学习nodejs,望请多多指教

可以试试thrift

哦,谢谢。能给个例子吗?呵呵

google一下吧 thrift的官网上有的, 社区里也有帖子: )

多谢多谢!

thrift吧,推荐

好的,我明天试试。多谢多谢。好人啊,呵呵

要在Node.js中调用Java程序的函数并获取其返回结果,可以使用child_process模块来执行外部命令。这通常通过创建子进程来完成。一种常见的方法是使用Java的命令行工具(如java -jar)运行Java程序,并将输入和输出通过标准输入/输出流进行通信。

以下是一个简单的示例,展示了如何在Node.js中调用Java程序并将结果返回到Node.js:

  1. 假设有一个简单的Java程序MyClass.java,其内容如下:

    public class MyClass {
        public static String greet(String name) {
            return "Hello, " + name + "!";
        }
    }
    
  2. 编译这个Java文件为MyClass.jar

    javac MyClass.java
    jar cf MyClass.jar MyClass.class
    
  3. 在Node.js中,你可以使用child_process.spawnchild_process.exec来调用该Java程序。这里使用spawn示例:

    const { spawn } = require('child_process');
    const util = require('util');
    
    // 将spawn方法包装成Promise以便使用async/await
    const spawnPromise = util.promisify(spawn);
    
    async function callJavaMethod(name) {
        try {
            const child = await spawnPromise('java', ['-cp', '.', 'MyClass', name]);
    
            let result = '';
            child.stdout.on('data', (data) => {
                result += data.toString();
            });
    
            child.stderr.on('data', (data) => {
                console.error(`stderr: ${data}`);
            });
    
            await new Promise((resolve, reject) => {
                child.on('close', (code) => {
                    if (code !== 0) {
                        reject(new Error(`Child process exited with code ${code}`));
                    } else {
                        resolve(result.trim());
                    }
                });
            });
    
            return result;
        } catch (error) {
            console.error(error);
            throw error;
        }
    }
    
    (async () => {
        const response = await callJavaMethod('World');
        console.log(response);  // 输出: Hello, World!
    })();
    

在这个示例中,我们首先定义了一个简单的Java类,它有一个静态方法greet,用于返回问候语。然后,我们编译了这个Java类,并将其打包成一个JAR文件。最后,在Node.js中,我们使用child_process.spawn来启动Java虚拟机,传递必要的参数,并捕获其输出。这样就可以在Node.js中调用Java方法并处理返回的结果。

回到顶部