Chrome扩展中通过Nashorn从JavaScript调用Java报错:Java未定义
Java is not defined错误 嗨,首先得给你点明一个核心误区:Chrome浏览器的JavaScript运行环境是V8引擎,而你尝试用的Nashorn是JDK自带的JavaScript引擎——只有在Java虚拟机(JVM)内部运行JS代码时,Java.type()这类Nashorn专属API才有效。Chrome的V8完全不认识Java这个全局对象,自然会抛出Uncaught ReferenceError: Java is not defined。
那Chrome扩展到底怎么调用Java函数呢?目前官方支持且可靠的方案是使用Chrome Native Messaging机制,我给你拆解下具体步骤:
第一步:编写Java版Native Messaging宿主程序
你需要写一个独立的Java程序,它要能处理Chrome扩展发来的消息,调用你需要的my.package.MyJavaClass里的函数,再把结果按规则返回给扩展。这里要注意:Chrome要求Native Messaging宿主的输入输出必须是带长度前缀的JSON消息——也就是先发送4字节的消息长度(小端字节序),再发送JSON格式的消息内容。第二步:注册Native Messaging宿主
新建一个JSON格式的宿主manifest文件,内容示例如下:{ "name": "com.your.host.name", "description": "Chrome扩展调用Java的宿主程序", "path": "/path/to/your/java/program/executable", "type": "stdio", "allowed_origins": [ "chrome-extension://YOUR_EXTENSION_ID_HERE/" ] }然后把这个manifest文件放到Chrome指定的系统目录:
- Windows:注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\com.your.host.name指向manifest路径 - macOS:
~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.your.host.name/manifest.json - Linux:
~/.config/google-chrome/NativeMessagingHosts/com.your.host.name/manifest.json
- Windows:注册表项
第三步:在Chrome扩展中调用Native Messaging API
在你的扩展JS代码里,用Chrome提供的API和Java宿主通信,示例代码如下:// 发送消息给Java宿主,调用指定函数 chrome.runtime.sendNativeMessage( 'com.your.host.name', { action: 'callMyJavaFunction', params: ['param1', 'param2'] }, function(response) { if (chrome.runtime.lastError) { console.error('通信出错:', chrome.runtime.lastError.message); } else { console.log('Java函数返回结果:', response); } } );
最后提醒几个容易踩的坑:
- 确保Java宿主程序有可执行权限(Linux/macOS下记得用
chmod +x给启动脚本加权限) - 扩展ID必须和宿主manifest里的
allowed_origins完全匹配,不能出错 - 严格遵循Native Messaging的消息格式,否则会出现通信中断的问题
别再尝试在Chrome的V8环境里用Nashorn的API了,这俩是完全独立的运行环境,根本不兼容~
内容的提问来源于stack exchange,提问作者David Tsaturyan

