Java 在不下载的情况下启动webstart。。。?
我制作了一个JavaWebStart应用程序,并创建了一个带有启动链接的HTML页面。问题是,在Google Chrome中,没有选项只“打开”一个文件而不保存它。我想制作一个HTML页面,它可以自动启动JNLP文件而无需保存它。或者更确切地说,用户不必打开他们的文件浏览器来启动它,这是可能的吗?使用使用web start部署的嵌入式小程序启动JNLP 从一个基于Swing的JApplet开始,它接受一个图像路径图标和一个按钮字符串。部署嵌入在web页面中的小程序,其中链接将使用JWS。 当用户单击该按钮时,使用该方法启动基于JWS框架的应用程序。正如我在报告中所指出的 ..在Java 6+中,显示另一个web start启动文件(如BasiceService.showcumentather.jnlp)的调用将直接传递给JavaWS,而不会出现浏览器窗口。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。 当用
不幸的是,这是一个错误/功能?在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,这是一个巨大的改进-非常感谢。