我制作了一个 Java webstart 应用程序,并创建了一个带有启动它的链接的 HTML 页面。问题是,在谷歌浏览器中,没有选项可以“打开”一个文件而不保存它。我想制作一个无需保存即可自动启动 JNLP 文件的 HTML 页面。或者更确切地说,用户不必打开他们的文件资源管理器来启动它)这可能吗?
5 回答
在厌倦了这个问题之后,我围绕扩展编写了自己的工作。
它是在 ubuntu 下编写的,但应该是可移植的(即使是带有一些工作/阅读的 win32)。
单击即可启动 jnlp 文件,无需提示或下载。它只是将 jnlp 文件的 url 直接传递给 javaws。没有杂乱的下载文件夹,没有额外的点击。
它简单、粗暴且有效。我过滤了 URL,所以它只适用于我自己的内部服务器,所以我不会意外启动一些随机的 jnlp 文件。我敢肯定,可以做更多的工作来改进它。按原样使用,无保修等。
文件:
/usr/local/bin/jnlp-launcher
#!/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 个文件:
清单.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://extensions 下的开发人员模式下将其加载为 chrome 中的 Unpacked 扩展
从 chrome://extensions 页面获取扩展的 ID。
接下来是扩展和 shell 脚本之间的桥梁。
文件:com.hcs.jnlplauncher.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”下(对于 linux)。有关 Windows 位置的信息,请参见谷歌。
将上一步中的扩展 ID 放入该文件中。
确保 javaws 在路径中。(该 chrome 运行)。链接到 /usr/bin 是最简单的确定方法。
单击一个 jnlp 文件并享受!没有提示,没有 ClickToOpen,也没有文件保存在 Downloads 目录中。!
如果有人想将这一切捆绑到一个很好的打包安装程序和/或 chrome 扩展中,请随意。请相信我(Chris Holt -- hobie744@gmail.com)并告诉我。乍一看,我看不出如何将 NativeMessagingHosts 块捆绑到扩展中。也许它必须是2件?这是我在 Chrome 扩展和 NativeMessaging 中的第一次冒险。大部分代码来自 API 文档和示例,并且可能存在一些错误。
使用使用 web start 部署的嵌入式小程序启动 JNLP。
- 从接受图像路径(图标)和按钮字符串的基于 Swing 的 JApplet 开始。使用 JWS 部署小程序(嵌入在链接所在的网页中)。
- 当用户单击按钮时,使用该
BasicService.showDocument(URL)
方法启动 JWS(基于框架)应用程序。正如我在演示中指出的那样。基本服务的....在 Java 6+ 中,显示另一个 web 启动文件的调用(例如
BasiceService.showDocument(another.jnlp))
,将直接交给 JavaWS,不会出现浏览器窗口。
不幸的是,这是 Google Chrome 中仍然存在的错误(/功能?) ,但它已部分修复:您现在可以自动打开 jnlp 文件,但它们仍保存到下载文件夹中
- 下载jnlp
- 在下载栏中右键单击并选择始终打开此类型的文件
- 点击 jnlp 现在直接启动它
这个示例(在 Swing 中嵌入 JavaFX 2)和文章是一个很好的示例,它们也适用于现代浏览器
示例http://www.oracle.com/technetwork/java/javase/overview/javafx-samples-2158687.html
文档:https ://docs.oracle.com/javase/8/docs/technotes/guides/deploy/deployment_toolkit.html#BABIJEHC
对于测试或网页抓取(当您无法更改或控制 jnlp 处理时),我通过 Selenium + Python 找到了一种解决方法(但类似的事情在 Java 或其他语言中也应该是可行的)。在 Python 中,我只需以编程方式单击 Chrome 中的通知以允许下载和安装 jnlp 文件(在 win32api 和 win32con 的帮助下,但在代码返工后,类似的方法也可以在 Linux 或 Mac 上工作)。您可以在此处查看详细信息