【问题标题】:Chrome Native Messaging using Executable Jar file使用可执行 Jar 文件的 Chrome 原生消息传递
【发布时间】:2013-12-31 17:47:42
【问题描述】:

我创建了一个 Chrome 扩展程序,并将 nativeMessaging 权限添加到清单中。

我正在为本地消息传递主机打开一个端口。

我的本​​机消息传递主机的清单指向一个可执行的 jar 文件。

当我启动我的扩展时,没有错误,连接似乎很好,但我的 jar 文件中的代码似乎永远不会运行。 (为了测试,我展示了一个在 main() 方法中创建的新 JFrame。双击 jar 文件时,它会显示 JFrame。但是当通过 Chrome Native Messaging 运行 jar 文件时,JFrame 不会出现。

我有什么遗漏吗?

【问题讨论】:

  • 你有没有成功让它工作?
  • Java 程序从来没有成功过。我最终使用了另一种语言。
  • @HairOfTheDog 我已经成功创建了一个。如果您仍然感兴趣,我可以提供帮助。
  • @farukdgn 你能告诉我如何使用清单文件运行 jar 文件
  • @HarshaXsoad 我已将其添加为答案。

标签: java chrome-native-messaging


【解决方案1】:

您的主音乐节名称中有大写字母吗? 我有这个问题+相同的症状,这为我解决了 (虽然我现在得到一个不同的错误)

{ “名称”:“com.google.chrome.example.echoUppercase”,

"name": "com.google.chrome.example.echouppercase",

【讨论】:

    【解决方案2】:

    我设法通过让 chrome 启动一个包含以下内容的 bat 文件来使其工作:

    @echo off
    java -jar your_file.jar %*
    

    回声关闭是一个我花了一些时间才弄清楚的细节。

    【讨论】:

    • BAT - 文件不会将文本发送回 Google chrome。这是错误的,很多人会浪费时间这样做。请发布如何直接从 json 运行 jar。
    • chrome的例子也是一个启动python程序的.bat。工作得很好。
    【解决方案3】:

    我已经设法使用 Java 可执行包装器(我使用了 Launch4j)来做到这一点。

    这是清单文件:

    {
        "name": "com.your.application",
        "description": "Your description.",
        "path": "path\\to\\wrapped\\java\\host.exe",
        "type": "stdio",
        "allowed_origins": [
            "chrome-extension://idofyourchromeextension/"
        ]
    }
    

    这是我包装的原生主机应用程序:

    import javax.swing.*;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.net.URISyntaxException;
    
    public class ChromeHandler
    {
        static public void main(String[] args)
        {
            InputStream input = System.in;
            try
            {
                System.in.available();
            }
            catch (Exception e)
            {
                return;
            }
            char receivedChar;
            try{
                FileOutputStream output = new FileOutputStream("PathToTextFile");
                while((receivedChar = (char) input.read()) != -1)
                {
                    output.write(receivedChar);
                    //My messages only have the '}' character at the end.
                    if(receivedChar == '}')
                    {
                        return;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    【讨论】:

    • 抱歉,回复晚了。谢谢你,我迷失了没有工作的java实现。会尽快尝试的。
    • 顺便问一下什么是“socket”?它是未定义的。
    • 我评论了套接字并尝试了您的解决方案,但它仍然给我“与本机消息传递主机通信时出错”错误。您是否能够使其成功运行。你能帮我解决这个问题吗?
    • @HarshaXsoad 是的,成功了。我在为您编辑时忘记删除 socket 部分。确保您的清单文件和注册表项正确且一致。仔细检查allowed_origins
    • 谢谢伙伴....但是我为我的项目选择了 c++,因为这对我也不起作用。但肯定有其他原因,因为这段代码对你有用。稍后我一定会再试一次,以找出问题所在。谢谢你的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多