Una guida per Java Web Start

1. Panoramica

Questo articolo spiega cos'è Java Web Start (JWS), come configurarlo sul lato server e come creare una semplice applicazione.

Nota: JWS è stato rimosso da Oracle JDK a partire da Java 11. In alternativa, considerare l'utilizzo di OpenWebStart.

2. Introduzione

JWS è un ambiente di runtime fornito con Java SE per il browser Web del client ed è disponibile dalla versione 5 di Java.

Con il download dei file JNLP (noto anche come Java Network Launch Protocol) dal server web, questo ambiente ci consente di eseguire i pacchetti JAR a cui fa riferimento in remoto.

In poche parole, il meccanismo carica ed esegue classi Java sul computer di un client con una normale installazione di JRE. Permette anche alcune istruzioni extra da Jakarta EE. Tuttavia, le restrizioni di sicurezza vengono applicate rigorosamente dal JRE del client, di solito avvisando l'utente di domini non affidabili, mancanza di HTTPS e persino di JAR non firmati.

Da un sito Web generico, è possibile scaricare un file JNLP per eseguire un'applicazione JWS. Una volta scaricato, può essere eseguito direttamente da un collegamento sul desktop o da Java Cache Viewer. Successivamente, scarica ed esegue i file JAR.

Questo meccanismo può essere molto utile per fornire un'interfaccia grafica che non è basata sul web (senza HTML), come un'applicazione di trasferimento file sicura, una calcolatrice scientifica, una tastiera sicura, un browser di immagini locale e così via.

3. Una semplice applicazione JNLP

Un buon approccio è scrivere un'applicazione e impacchettarla in un file WAR per normali server web. Tutto ciò di cui abbiamo bisogno è scrivere la nostra applicazione desiderata (di solito con Swing) e impacchettarla in un file JAR. Questo JAR deve quindi, a sua volta, essere impacchettato in un file WAR insieme a un JNLP che farà riferimento, scaricherà ed eseguirà normalmente la classe Main della sua applicazione .

Non c'è differenza con una normale applicazione web contenuta in un file WAR, tranne per il fatto che abbiamo bisogno di un file JNLP per abilitare JWS, come verrà dimostrato di seguito.

3.1. Applicazione Java

Cominciamo scrivendo una semplice applicazione Java:

public class Hello { public static void main(String[] args) { JFrame f = new JFrame("main"); f.setSize(200, 100); f.setLocationRelativeTo(null); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel label = new JLabel("Hello World"); f.add(label); f.setVisible(true); } }

Possiamo vedere che questa è una lezione di Swing piuttosto semplice. In effetti, non è stato aggiunto nulla per renderlo conforme a JWS.

3.2. Applicazione web

Tutto ciò di cui abbiamo bisogno è creare un pacchetto JAR di questa classe Swing di esempio in un file WAR insieme al seguente file JNLP:

   Hello Example       

Chiamiamolo hello.jndl e posizioniamolo in una qualsiasi cartella web del nostro WAR. Sia il JAR che il WAR sono scaricabili, quindi non dobbiamo preoccuparci di mettere il JAR in una cartella lib .

L'indirizzo URL del nostro JAR finale è hardcoded nel file JNLP, il che può causare alcuni problemi di distribuzione. Se cambiamo server di distribuzione, l'applicazione non funzionerà più.

Risolviamolo con un servlet appropriato più avanti in questo articolo. Per ora, posizioniamo semplicemente il file JAR per il download nella cartella principale come index.html e collegalo a un elemento di ancoraggio:

Launch

Impostiamo anche la classe principale nel nostro JAR Manifest . Questo può essere ottenuto configurando il plugin JAR nel file pom.xml . Allo stesso modo, spostiamo il file JAR al di fuori di WEB-INF / lib , poiché è pensato solo per il download, cioè non per il classloader:

 org.apache.maven.plugins maven-jar-plugin ...   compile  jar      com.example.Hello     ${project.basedir}/target/jws     

4. Configurazioni speciali

4.1. Problemi di sicurezza

Per eseguire un'applicazione, dobbiamo firmare il JAR . La creazione di un certificato valido e l'utilizzo del plug-in JAR Sign Maven va oltre lo scopo di questo articolo, ma possiamo aggirare questa politica di sicurezza per scopi di sviluppo o se abbiamo accesso amministrativo al computer del nostro utente.

A tal fine, è necessario aggiungere l'URL locale (ad esempio: // localhost: 8080 ) all'elenco delle eccezioni di sicurezza dell'installazione JRE sul computer in cui verrà eseguita l'applicazione. Può essere trovato aprendo il Pannello di controllo Java (su Windows, possiamo trovarlo tramite il Pannello di controllo) nella scheda Sicurezza.

5. JnlpDownloadServlet

5.1. Algoritmi di compressione

C'è un servlet speciale che può essere incluso nel nostro WAR. Ottimizza il download cercando la versione compilata più compressa del nostro file JAR, se disponibile, e corregge anche il valore codebase hardcoded sul file JLNP.

Poiché il nostro JAR sarà disponibile per il download, è consigliabile impacchettarlo con un algoritmo di compressione, come Pack200, e fornire il JAR normale e qualsiasi versione compressa JAR.PACK.GZ o JAR.GZ nella stessa cartella in modo che questo servlet possa scegli l'opzione migliore per ogni caso.

Sfortunatamente, non esiste ancora una versione stabile di un plug-in Maven per questo algoritmo di compressione, ma potremmo lavorare con l'eseguibile Pack200 fornito con JRE (di solito, installato nel percorso {JAVA_SDK_HOME} / jre / bin / ).

Senza modificare il nostro JNLP e posizionando le versioni jar.gz e jar.pack.gz del JAR nella stessa cartella, il servlet sceglie quella migliore una volta che riceve una chiamata da un JNLP remoto. Ciò migliora l'esperienza dell'utente e ottimizza il traffico di rete.

5.2. Codebase Dynamic Substitution

Il servlet può anche eseguire sostituzioni dinamiche per URL hardcoded in etichetta. Modificando il JNLP nel carattere jolly, fornisce lo stesso tag di rendering finale.

Il servlet funziona anche con i caratteri jolly $$ codebase , $$ hostname , $$ name e $$ site , che risolveranno " // localhost: 8080 / jnlp-example / ", " localhost: 8080 ", " hello.jnlp " e " // localhost: 8080 " rispettivamente.

5.3. Aggiunta del servlet al Classpath

Per aggiungere il servlet, configuriamo una normale mappatura servlet per i modelli JAR e JNLP al nostro web.xml :

 JnlpDownloadServlet  jnlp.sample.servlet.JnlpDownloadServlet    JnlpDownloadServlet *.jar   JnlpDownloadServlet *.jnlp 

Il servlet stesso viene fornito in una serie di JAR ( jardiff.jar e jnlp-servlet.jar ) che si trovano oggi nella sezione Demos & Samples nella pagina di download di Java SDK.

Nell'esempio GitHub, questi file sono inclusi nella cartella java-core-samples-lib e sono inclusi come risorse web dal plugin Maven WAR:

 org.apache.maven.plugins maven-war-plugin ...     ${project.basedir}/java-core-samples-lib/   **/*.jar  WEB-INF/lib    

6. Considerazioni finali

Java Web Start è uno strumento che può essere utilizzato in ambienti (intranet) in cui non è presente un server delle applicazioni. Inoltre, per le applicazioni che devono manipolare i file degli utenti locali.

Un'applicazione viene spedita all'utente finale tramite un semplice protocollo di download, senza alcuna dipendenza o configurazione aggiuntiva, ad eccezione di alcuni problemi di sicurezza (HTTPS, JAR firmato, ecc.).

Nell'esempio Git, il codice sorgente completo descritto in questo articolo è disponibile per il download. Possiamo scaricarlo direttamente da GitHub su un sistema operativo con Tomcat e Apache Maven. Dopo il download, è necessario eseguire il comando mvn install dalla directory di origine e copiare il file jws.war generato dalla destinazione alla cartella webapps dell'installazione di Tomcat.

Dopodiché, possiamo avviare Tomcat come al solito.

Da un'installazione predefinita di Apache Tomcat, l'esempio sarà disponibile all'URL //localhost:8080/jws/index.html .