2012-07-26 33 views
5

Java web başlatıcı uygulaması yaptım ve başlatmak için bağlantıya sahip bir HTML sayfası oluşturdum. Sorun şu ki, Google Chrome’da, dosyayı kaydetmeden sadece 'Aç' seçeneği yoktur. Bunu kaydetmek zorunda kalmadan bir JNLP dosyasını otomatik olarak başlatabilen bir HTML sayfası oluşturmak istiyorum. Ya da, kullanıcının dosyayı açmak için dosya gezgini açmak zorunda kalmadan) Bu mümkün mü?Webstart'ı indirmeden indir ...?

+0

İlgili: http: // stackoverflow. com/questions/9348449/can-ı-delete-indirilen-jnlp-dosya-java-web-start-jws-from-java-uygulama – finnw

cevap

2

JNLP'yi, web başlatıcısını kullanarak yerleştirilen yerleşik bir uygulama kullanarak başlatın.

  1. bir görüntü yolunu (simge) ve düğme için bir dize kabul JApplet dayalı bir Swing ile Başlat. JWS'yi kullanarak uygulamayı (bağlantının olduğu web sayfasına gömülü olarak) dağıtın.
  2. Kullanıcı bu düğmeyi tıklattığında, JWS (çerçeve tabanlı) uygulamasını başlatmak için BasicService.showDocument(URL) yöntemini kullanın. Ben .. demo. of the BasicService içinde

    ..in Java 6+ belirttiği gibi, bir çağrı (örneğin BasiceService.showDocument(another.jnlp)) görünen hiçbir tarayıcı penceresi ile javaws doğrudan teslim , edilecek başka bir web başlatmak başlatmak dosyasını göstermek için.

+1

Tamam, ama krom, JavaWS teslim değil. Bir tarayıcı penceresi açar ..... – DankMemes

+3

Ayrıca, Chrome uygulamalarını desteklemeyi durdurdu. –

2

Ne yazık ki bu, ancak kısmen sabitlendiği still exists bir hata (?/özellik) Google Chrome içinde: indirme klasörüne yapabilirsiniz artık otomatik açık jnlp dosyaları, ancak yine de kaydedilir

  • indirme indir çubuğunda
  • sağ tıklayın ve doğrudan şimdi JNLP tıklayarak bu tip
  • her zaman açık dosyalara seçmek jnlp bu sorunu bıkmış hale getirilmesinden sonra bunu
+3

'dan beri jnlps için "her zaman açık" seçeneğini engelliyorlar. Çok sinir bozucu. Bir geçici çözüm için aşağıdaki yanıttaki hayal kırıklığımın sonucunu görün. –

4

başlattı, ben yazdım kendi işimin uzantısı.

Ubuntu'nun altında yazılmıştır, ancak taşınabilir olmalıdır (hatta bir çalışma/okuma ile32 kazanmak için).

Tek bir tıklama, bir jnlp dosyasını sormadan veya indirmeden başlatır. jnlp dosyasının URL'sini doğrudan javaws'a geçirir. Karışık İndirme klasörü yok, fazladan tıklama yok.

Bu basit, ham ve etkilidir. URL'yi filtreledim, böylece sadece kendi iç sunucum için geçerli olacaktı, bu yüzden rasgele bir jnlp dosyası açmayacağım. Bunu geliştirmek için daha çok şey yapılabilir, eminim. vs vs AS-İŞ, hiçbir garanti, kullanın

dosyaları:

/usr/local/bin/jnlp-başlatıcısı

#!/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() 

krom uzantısı 2 dosya yerel yerleştirilir dizin:

manifest.json

{ 
    "manifest_version": 2, 

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

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

    "permissions": [ 
    "downloads", "nativeMessaging" 
    ] 
} 

Ve bg.js (ana bilgisayar filtreleri için gerektiği gibi düzenleyin)

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); 
        } 
       ); 
     } 
    } 

}) 

Bildiri belirtiniz.json ve bg.js bir klasörde ve chrome: geliştirici modunda chrome'da Unpacked uzantısı olarak yükleyin: // extensions

chrome: // extensions sayfalarından uzantının kimliğini alın.

Sonraki uzantı ve kabuk komut dosyası arasındaki köprüdür.

Dosya: com.hcs.jnlplauncher.json

{ 
    "name": "com.hcs.jnlplauncher", 
    "description": "JNLP Launcher", 
    "path": "/usr/local/bin/jnlp-launcher", 
    "type": "stdio", 
    "allowed_origins": [ 
    "chrome-extension://iacomlhfiphkdfjjjmlgckdkhmkhkibe/" 
    ] 
} 

Place Bu altında (linux için) "~/.config/google-chrome/NativeMessagingHosts". windows konumları için google bakın.

Uzantı kimliğinizi önceki adımdan bu dosyaya koyun.

Javaws'ın yolunda olduğundan emin olun. (krom ile çalışır)./usr/bin için bağlantı emin olmak için en kolay yoldur.

Bir jnlp dosyasına tıklayın ve keyfini çıkarın! Hiçbir bilgi istemez, ClickToOpen yok ve İndirilenler dizininde hiç dosya kaydedilmedi.

Birisi bunları birlikte paketlenmiş bir yükleyiciye paketlemek isterse ve/veya krom uzantısına sahip olmak istemiyorsanız. Lütfen bana not ver (Chris Holt - [email protected]) ve bana haber ver. İlk bakışta, NativeMessagingHosts parçasının uzantıya nasıl ekleneceğini göremedim. Belki 2 parça olmalı? Bu, Chrome Uzantıları ve NativeMessaging'deki ilk serüvenim. Kodun çoğu API belgelerinden ve örneklerinden gelir ve muhtemelen birkaç hata vardır.

+0

Merhaba @Chris Holt, bu harika. Ama chrome'um hala dosyayı indiriyor; Ancak şimdi indirilen dosyayı durum çubuğunda tıklayabiliyorum ve daha sonra javaws, büyük iyileştirme başlatacak - çok teşekkür ederim. – tink