明白了,简洁说:在 VSCode 插件里,前端用 TypeScript,后端用 Java,通常用子进程(child_process)启动 Java 程序,通过**标准输入输出(stdin/stdout)**通信。
这种方式稳定且简单,适合你的场景。
下面是完整示例:
// Backend.java
import java.util.Scanner;
public class Backend {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()) {
String input = scanner.nextLine();
System.out.println("Java received: " + input);
}
scanner.close();
}
}
编译:
javac Backend.java
生成 Backend.class。
(比如放在你的 extension.ts 里)
import * as vscode from 'vscode';
import { spawn } from 'child_process';
export function activate(context: vscode.ExtensionContext) {
const javaProcess = spawn('java', ['-cp', context.extensionPath, 'Backend']);
javaProcess.stdout.on('data', (data) => {
vscode.window.showInformationMessage(`From Java: ${data.toString()}`);
});
javaProcess.stderr.on('data', (data) => {
console.error(`Java error: ${data}`);
});
javaProcess.on('close', (code) => {
console.log(`Java process exited with code ${code}`);
});
// 例子:发送一条消息给 Java
let disposable = vscode.commands.registerCommand('extension.sendMessage', () => {
javaProcess.stdin.write('Hello from VSCode!\n');
});
context.subscriptions.push(disposable);
}
export function deactivate() {}
TypeScript 用 spawn 启动 Java
通过 stdin.write() 给 Java 发送数据
Java 用 System.out.println() 回传数据,TypeScript 监听 stdout
插件激活时就可以通信了
要不要我顺便再给你画一个小通信流程图?更直观一点📈?