Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在不下载的情况下启动webstart。。。?_Java_Google Chrome_Jnlp_Java Web Start - Fatal编程技术网

Java 在不下载的情况下启动webstart。。。?

Java 在不下载的情况下启动webstart。。。?,java,google-chrome,jnlp,java-web-start,Java,Google Chrome,Jnlp,Java Web Start,我制作了一个JavaWebStart应用程序,并创建了一个带有启动链接的HTML页面。问题是,在Google Chrome中,没有选项只“打开”一个文件而不保存它。我想制作一个HTML页面,它可以自动启动JNLP文件而无需保存它。或者更确切地说,用户不必打开他们的文件浏览器来启动它,这是可能的吗?使用使用web start部署的嵌入式小程序启动JNLP 从一个基于Swing的JApplet开始,它接受一个图像路径图标和一个按钮字符串。部署嵌入在web页面中的小程序,其中链接将使用JWS。 当用

我制作了一个JavaWebStart应用程序,并创建了一个带有启动链接的HTML页面。问题是,在Google Chrome中,没有选项只“打开”一个文件而不保存它。我想制作一个HTML页面,它可以自动启动JNLP文件而无需保存它。或者更确切地说,用户不必打开他们的文件浏览器来启动它,这是可能的吗?

使用使用web start部署的嵌入式小程序启动JNLP

从一个基于Swing的JApplet开始,它接受一个图像路径图标和一个按钮字符串。部署嵌入在web页面中的小程序,其中链接将使用JWS。 当用户单击该按钮时,使用该方法启动基于JWS框架的应用程序。正如我在报告中所指出的

..在Java 6+中,显示另一个web start启动文件(如BasiceService.showcumentather.jnlp)的调用将直接传递给JavaWS,而不会出现浏览器窗口。


不幸的是,这是一个错误/功能?在Google Chrome中,这部分是固定的:你现在可以自动打开jnlp文件,但它仍然保存在下载文件夹中

下载jnlp 在下载栏中单击鼠标右键,然后选择“始终打开此类型的文件” 单击jnlp现在直接启动它
在厌倦了这个问题之后,我写了自己关于扩展的工作

它是在ubuntu下编写的,但应该可以通过一些工作/阅读甚至移植到win32

单击即可启动jnlp文件,无需提示或下载。它只是将jnlp文件的url直接传递给javaws。没有杂乱的下载文件夹,没有额外的点击

它简单、粗糙、有效。我过滤了URL,这样它就只适用于我自己的内部服务器,这样我就不会意外地启动一些随机的jnlp文件。我相信,我们还可以做更多的工作来改进它。按原样使用,无保修等

文件:

/usr/local/bin/jnlp启动器

#!/usr/bin/env python

import struct
import sys
import threading
import Queue
import json
import os


# On Windows, the default I/O mode is O_TEXT. Set this to O_BINARY
# to avoid unwanted modifications of the input/output streams.
if sys.platform == "win32":
  import os, msvcrt
  msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
  msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)

# Helper function that sends a message to the webapp.
def send_message(message):
   # Write message size.
  sys.stdout.write(struct.pack('I', len(message)))
  # Write the message itself.
  sys.stdout.write(message)
  sys.stdout.flush()

# Thread that reads messages from the webapp.
def read_thread_func(queue):
  message_number = 0
  while 1:
    # Read the message length (first 4 bytes).
    text_length_bytes = sys.stdin.read(4)

    if len(text_length_bytes) == 0:
      if queue:
        queue.put(None)
      sys.exit(0)

    # Unpack message length as 4 byte integer.
    text_length = struct.unpack('i', text_length_bytes)[0]

    # Read the text (JSON object) of the message.
    text = sys.stdin.read(text_length).decode('utf-8')

    decoded = json.loads(text);
    os.system("javaws " + decoded['url']);


def Main():
  read_thread_func(None)
  send_message('"complete"')
  sys.exit(0)

if __name__ == '__main__':
  Main()
chrome扩展名为2个文件,位于本地目录中:

manifest.json

{
  "manifest_version": 2,

   "background": {
      "persistent": false,
      "scripts": [ "bg.js" ]
   },

  "name": "JNLP Fixer",
  "description": "Handle JNLPs",
  "version": "1.0",

  "permissions": [
    "downloads", "nativeMessaging"
  ]
}
和bg.js根据主机筛选器的需要进行编辑

chrome.downloads.onCreated.addListener(function(downloadId) {
    var expr = /\.jnlp$/;
    //this is to limit where we apply the auto-launch.
    //for our use, i only wanted it for internal jnlps.
    var hostExpr = /(http|https):\/\/internal.company.com\//;
    if (hostExpr.test(downloadId.url)) {
        if (downloadId.state == "in_progress") {
            console.log(downloadId.url);
            chrome.downloads.cancel(downloadId.id,function() {
                console.log("cancelled");
            });
            chrome.runtime.sendNativeMessage("com.hcs.jnlplauncher", 
                                             {url:downloadId.url}, 
                                             function(response) 
                                             {
                    console.log(chrome.runtime.lastError);
                    console.log(response);
                    }
                );
        }
    }

})
将manifest.json和bg.js放在一个文件夹中,并将其作为开发人员模式下的chrome中的未打包扩展加载chrome://extensions

从中获取扩展的IDchrome://extensions 页数

接下来是扩展和shell脚本之间的桥梁

文件:com.hcs.jnlplancher.json

{
  "name": "com.hcs.jnlplauncher",
  "description": "JNLP Launcher",
  "path": "/usr/local/bin/jnlp-launcher",
  "type": "stdio",
  "allowed_origins": [
    "chrome-extension://iacomlhfiphkdfjjjmlgckdkhmkhkibe/"
  ]
}
将其置于~/.config/google chrome/NativeMessagingHosts for linux下。有关windows位置,请参见谷歌

将上一步中的扩展名ID放入该文件

确保javaws在路径中。那个铬合金是用的。链接到/usr/bin是最容易确定的方法

点击jnlp文件并享受!!!没有提示,没有单击打开,下载目录中也没有保存任何文件


如果有人想将这一切捆绑到一个很好的打包安装程序和/或chrome扩展,请随意。请相信我克里斯·霍尔特-hobie744@gmail.com让我知道。乍一看,我不知道如何将NativeMessagingHosts片段捆绑到扩展中。也许必须是两件?这是我第一次尝试Chrome扩展和NativeMessaging。大部分代码来自API文档和示例,可能还有一些bug

这个示例在Swing和文章中嵌入JavaFX2是一个很好的示例,它们也适用于现代浏览器

样品


文档:

对于无法更改或控制jnlp处理的测试或webscraping,我通过Selenium+Python找到了一个解决方法,但类似的事情在Java或其他语言中也应该是可行的。在Python中,我只需通过编程方式单击Chrome中的通知,就可以在win32api和win32con的帮助下下载和安装jnlp文件,但在代码返工后,类似的方法也可以在Linux或Mac上使用。您可以看到相关的详细信息:它们已经阻止了JNLP的始终打开选项。很烦人。在下面的答案中看到我沮丧的结果,找到解决办法。另外,Chrome停止支持小程序。嗨@Chris Holt,太棒了。但是我的chrome仍然下载文件;不过,我现在可以在状态栏中单击下载的文件,然后它将启动javaws,这是一个巨大的改进-非常感谢。