Qual è il modo migliore per rilevare se un'applicazione viene avviata da Webstart

StackOverflow https://stackoverflow.com/questions/216315

  •  03-07-2019
  •  | 
  •  

Domanda

Come è stato chiarito nel mio domanda recente , le applicazioni Swing devono chiamare esplicitamente System.exit () quando vengono eseguite utilizzando il programma di avvio di Sun Webstart (almeno a partire da Java SE 6).

Voglio limitare questo hack il più possibile e sto cercando un modo affidabile per rilevare se l'applicazione è in esecuzione su Webstart. In questo momento sto verificando che il valore della proprietà di sistema " webstart.version " non è nullo, ma non ho trovato alcuna garanzia nella documentazione che questa proprietà dovrebbe essere impostata da versioni future / implementazioni alternative.

Esistono modi migliori (preferibilmente quelli che non generano una dipendenza dall'API webstart?)

È stato utile?

Soluzione

Quando il codice viene avviato tramite javaws, viene caricato javaws.jar e sono disponibili le classi API JNLP da cui non si desidera dipendere. Invece di testare una proprietà di sistema che non è garantita per esistere, potresti invece vedere se esiste una classe API JNLP:

private boolean isRunningJavaWebStart() {
    boolean hasJNLP = false;
    try {
      Class.forName("javax.jnlp.ServiceManager");
      hasJNLP = true;
    } catch (ClassNotFoundException ex) {
      hasJNLP = false;
    }
    return hasJNLP;
}

Questo evita anche la necessità di includere javaws.jar nel tuo percorso di classe durante la compilazione.

In alternativa puoi passare alla compilazione con javaws.jar e catturare invece NoClassDefFoundError:

private boolean isRunningJavaWebStart() {
    try {
        ServiceManager.getServiceNames();
        return ds != null;
    } catch (NoClassDefFoundError e) {
        return false;
    }
}

L'uso di ServiceManager.lookup (String) e UnavailableServiceException è un problema perché entrambi fanno parte dell'API JNLP. ServiceManager.getServiceNames () non è documentato da lanciare. Stiamo chiamando specificamente questo codice per verificare la presenza di NoClassDefFoundError.

Altri suggerimenti

Utilizzare javax.jnlp.ServiceManager per recuperare un servizio di webstart. Se è disponibile, stai utilizzando Webstart.

Vedi http://download.java.net /jdk7/docs/jre/api/javaws/jnlp/index.html

Come hai detto, controllare la proprietà System come segue è probabilmente il modo più pulito:

private boolean isRunningJavaWebStart() {
    return System.getProperty("javawebstart.version", null) != null;
}

In un sistema di produzione ho usato la tecnica di cui sopra per anni.

Puoi anche provare a verificare se ci sono proprietà che iniziano con " jnlpx. " ma nessuno di questi è veramente "garantito" essere lì, per quanto ne so.

Un'alternativa potrebbe essere quella di tentare di creare un'istanza del DownloadService suggerito da Tom:

private boolean isRunningJavaWebStart() {
    try {
        DownloadService ds = (DownloadService) ServiceManager.lookup("javax.jnlp.DownloadService");
        return ds != null;
    } catch (UnavailableServiceException e) {
        return false;
    }
}

Ovviamente questo ha il rovescio della medaglia di abbinare il tuo codice a quell'API.

Non ho una vera esperienza con Java Web Start se non guardandola qualche anno fa.

Che ne dici di avviare l'applicazione con un parametro che definisci di quello che imposti all'avvio dell'app tramite Java web start.

Se vuoi passare argomenti alla tua app, devi aggiungerli al file di avvio (aka descrittore JNLP) usando o gli elementi.

Quindi controlla se queste proprietà sono impostate.

Ancora una volta questo è un suggerimento che non ho codificato per JWS e potrebbe non essere così semplice.

È possibile verificare se il classloader corrente è un'istanza di com.sun.jnlp.JNLPClassLoader (plugin Java 1) o sun.plugin2.applet.JNLP2ClassLoader (plugin Java 2). Nonostante l'applet " pacchetto, un'applet che utilizza JNLP con il plugin Java 2 utilizza un altro classloader, sun.plugin2.applet.Applet2ClassLoader. Funziona anche con OpenJDK.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top