Java Webstart アプリケーションを作成し、それを起動するためのリンクを含む HTML ページを作成しました。問題は、Google Chrome では、ファイルを保存せずに「開く」オプションがないことです。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 にロードします。
chrome://extensions ページから拡張機能の ID を取得します。
次は、拡張機能とシェル スクリプトの間のブリッジです。
ファイル: 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 の場所については、Google を参照してください。
前のステップの拡張 ID をそのファイルに入れます。
javaws がパスにあることを確認してください。(そのクロムが実行されます)。/usr/bin へのリンクを確認するのが最も簡単な方法です。
jnlp ファイルをクリックしてお楽しみください!!! プロンプトも、ClickToOpen も、ダウンロード ディレクトリに保存されたファイルもありません。
誰かがこれをパッケージ化されたインストーラーや chrome 拡張機能にまとめてバンドルしたい場合は、お気軽に。私 (Chris Holt -- hobie744@gmail.com) の功績を認めて、お知らせください。一見すると、NativeMessagingHosts の部分を拡張機能にバンドルする方法がわかりませんでした。もしかして2ピースじゃなきゃいけないの?これは、Chrome 拡張機能と NativeMessaging の最初の冒険です。ほとんどのコードは API のドキュメントとサンプルに基づいており、おそらくいくつかのバグがあります。
Web Start を使用してデプロイされた組み込みアプレットを使用して JNLP を起動します。
- 画像パス (アイコン) とボタンの文字列を受け入れる Swing ベースの JApplet から始めます。JWS を使用してアプレット (リンクがある Web ページに埋め込まれている) をデプロイします。
- ユーザーがボタンをクリックすると、
BasicService.showDocument(URL)
メソッドを使用して JWS (フレーム ベース) アプリを起動します。私がデモで指摘したように。BasicService の....Java 6+ では、別の Web Start 起動ファイルを表示するための呼び出し (たとえば、ブラウザー ウィンドウが表示されずに JavaWS に
BasiceService.showDocument(another.jnlp))
直接渡されます。
残念ながら、これはまだ存在するGoogle Chrome のバグ (/機能?) ですが、部分的に修正されています。jnlp ファイルを自動的に開くことができるようになりましたが、ダウンロード フォルダーに保存されたままになります。
- jnlpをダウンロードする
- ダウンロードバーを右クリックして、このタイプのファイルを常に開くように選択します
- jnlp をクリックすると、直接起動するようになりました
このサンプル (Embedding JavaFX 2 in Swing) と記事は優れたサンプルであり、最新のブラウザーでも動作します。
サンプル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