Een gids voor het Java-web Start

1. Overzicht

In dit artikel wordt uitgelegd wat Java Web Start (JWS) is, hoe u het aan de serverzijde configureert en hoe u een eenvoudige toepassing maakt.

Opmerking: De JWS is verwijderd uit de Oracle JDK, beginnend met Java 11. Overweeg als alternatief OpenWebStart te gebruiken.

2. Inleiding

JWS is een runtime-omgeving die wordt geleverd met de Java SE voor de webbrowser van de klant en bestaat al sinds Java-versie 5.

Met het downloaden van de JNLP-bestanden (ook bekend als Java Network Launch Protocol) van de webserver, stelt deze omgeving ons in staat om op afstand JAR-pakketten uit te voeren waarnaar wordt verwezen.

Simpel gezegd, het mechanisme laadt en voert Java-klassen uit op de computer van een klant met een normale JRE-installatie. Het laat ook wat extra instructies van Jakarta EE toe. Beveiligingsbeperkingen worden echter strikt toegepast door de JRE van de klant, waarbij de gebruiker meestal wordt gewaarschuwd voor onbetrouwbare domeinen, gebrek aan HTTPS en zelfs niet-ondertekende JAR's.

Van een generieke website kan men een JNLP-bestand downloaden om een ​​JWS-applicatie uit te voeren. Eenmaal gedownload, kan het rechtstreeks worden uitgevoerd vanaf een snelkoppeling op het bureaublad of de Java Cache Viewer. Daarna worden JAR-bestanden gedownload en uitgevoerd.

Dit mechanisme kan erg handig zijn om een ​​grafische interface te leveren die niet webgebaseerd is (HTML-vrij), zoals een veilige applicatie voor bestandsoverdracht, een wetenschappelijke rekenmachine, een beveiligd toetsenbord, een lokale afbeeldingsbrowser enzovoort.

3. Een eenvoudige JNLP-applicatie

Een goede benadering is om een ​​applicatie te schrijven en deze in een WAR-bestand voor gewone webservers te verpakken. Het enige wat we nodig hebben, is onze gewenste applicatie schrijven (meestal met Swing) en deze in een JAR-bestand verpakken. Deze JAR moet dan op zijn beurt worden verpakt in een WAR-bestand, samen met een JNLP dat de applicaties van zijn applicatie zal raadplegen, downloaden en uitvoeren. Hoofd klasse normaal.

Er is geen verschil met een reguliere webapplicatie verpakt in een WAR-bestand, behalve dat we een JNLP-bestand nodig hebben om de JWS in te schakelen, zoals hieronder zal worden gedemonstreerd.

3.1. Java-applicatie

Laten we beginnen met het schrijven van een eenvoudige Java-applicatie:

openbare klasse Hallo {openbare statische leegte hoofd (String [] args) {JFrame f = nieuw JFrame ("hoofd"); f.setSize (200, 100); f.setLocationRelativeTo (null); f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); JLabel label = nieuw JLabel ("Hallo wereld"); f.add (label); f.setVisible (true); }}

We kunnen zien dat dit een vrij eenvoudige Swing-les is. Er is inderdaad niets toegevoegd om het JWS-compatibel te maken.

3.2. Web applicatie

Het enige wat we nodig hebben is om JAR dit voorbeeld Swing-klasse te verpakken in een WAR-bestand samen met het volgende JNLP-bestand:

   Hallo voorbeeld 

Laten we het een naam geven hallo.jndl en plaats het onder een webfolder van onze WAR. Zowel de JAR als de WAR kunnen worden gedownload, dus we hoeven ons geen zorgen te maken om de JAR in een lib map.

Het URL-adres van onze uiteindelijke JAR is hard gecodeerd in het JNLP-bestand, wat enkele distributieproblemen kan veroorzaken. Als we de implementatieservers wijzigen, werkt de applicatie niet meer.

Laten we dat later in dit artikel oplossen met een goede servlet. Laten we voorlopig het JAR-bestand om te downloaden in de hoofdmap plaatsen als het index.html, en koppel het aan een ankerelement:

Lancering

Laten we ook de hoofdklasse instellen in ons JAR-manifest. Dit kan worden bereikt door de JAR-plug-in in het pom.xml het dossier. Op dezelfde manier verplaatsen we het JAR-bestand buiten het WEB-INF / lib, aangezien het alleen bedoeld is om te downloaden, d.w.z. niet voor de classloader:

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

4. Speciale configuraties

4.1. Veiligheidsproblemen

Om een ​​applicatie uit te voeren, we moeten de JAR ondertekenen. Het maken van een geldig certificaat en het gebruik van de JAR Sign Maven-plug-in valt buiten het bestek van dit artikel, maar we kunnen dit beveiligingsbeleid omzeilen voor ontwikkelingsdoeleinden of als we beheerderstoegang hebben tot de computer van onze gebruiker.

Om dit te doen, moeten we de lokale URL toevoegen (bijvoorbeeld: // localhost: 8080) naar de lijst met beveiligingsuitzonderingen van de JRE-installatie op de computer waarop de toepassing zal worden uitgevoerd. Het kan worden gevonden door het Java-configuratiescherm te openen (in Windows kunnen we het vinden via het configuratiescherm) op het tabblad Beveiliging.

5. Het JnlpDownloadServlet

5.1. Compressie-algoritmen

Er is een speciale servlet die in onze WAR kan worden opgenomen. Het optimaliseert de download door te zoeken naar de meest gecomprimeerde gecompileerde versie van ons JAR-bestand, indien beschikbaar, en repareert ook de hard gecodeerde codebase waarde in het JLNP-bestand.

Aangezien onze JAR beschikbaar zal zijn om te downloaden, is het raadzaam om deze te verpakken met een compressie-algoritme, zoals Pack200, en de gewone JAR en elke gecomprimeerde JAR.PACK.GZ- of JAR.GZ-versie in dezelfde map af te leveren, zodat deze servlet kan kies de beste optie voor elk geval.

Helaas is er nog geen stabiele versie van een Maven-plug-in voor dit compressie-algoritme, maar we kunnen werken met het Pack200-uitvoerbare bestand dat bij de JRE wordt geleverd (meestal geïnstalleerd op het pad {JAVA_SDK_HOME} / jre / bin /).

Zonder ons JNLP te wijzigen en door de jar.gz en jar.pack.gz versies van de JAR in dezelfde map, kiest de servlet de betere zodra deze wordt gebeld door een extern JNLP. Dit verbetert de gebruikerservaring en optimaliseert het netwerkverkeer.

5.2. Codebase dynamische vervanging

De servlet kan ook dynamische vervangingen uitvoeren voor hardcoded URL's in het label. Door het JNLP te veranderen in het jokerteken , levert het dezelfde uiteindelijke gerenderde tag op.

De servlet werkt ook met de jokertekens $$ codebase, $$ hostnaam, $$ naam en $$ site, die zal oplossen "// localhost: 8080 / jnlp-voorbeeld /“, “localhost: 8080“, “hallo.jnlp", En"// localhost: 8080”Respectievelijk.

5.3. De servlet aan het klassenpad toevoegen

Laten we, om de servlet toe te voegen, een normale servlet-toewijzing configureren voor JAR- en JNLP-patronen aan onze web.xml:

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

De servlet zelf wordt geleverd in een set JAR's (jardiff.jar en jnlp-servlet.jar) die zich tegenwoordig in de sectie Demo's en voorbeelden op de downloadpagina van Java SDK bevinden.

In het GitHub-voorbeeld zijn deze bestanden opgenomen in het java-core-samples-lib map en worden als webbronnen opgenomen door de Maven WAR-plug-in:

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

6. Laatste gedachten

Java Web Start is een tool die kan worden gebruikt in (intranet) omgevingen waar geen applicatieserver aanwezig is. Ook voor toepassingen die lokale gebruikersbestanden moeten manipuleren.

Een applicatie wordt naar de eindgebruiker verzonden via een eenvoudig downloadprotocol, zonder enige extra afhankelijkheden of configuratie, behalve enkele beveiligingsproblemen (HTTPS, ondertekende JAR, enz.).

In het Git-voorbeeld is de volledige broncode die in dit artikel wordt beschreven, beschikbaar om te downloaden. We kunnen het rechtstreeks van GitHub downloaden naar een besturingssysteem met Tomcat en Apache Maven. Na het downloaden moeten we het mvn installeren commando uit de bronmap en kopieer het gegenereerde jws.war bestand uit het doelwit naar de webapps map van de Tomcat-installatie.

Daarna kunnen we Tomcat zoals gewoonlijk starten.

Van een standaard Apache Tomcat-installatie is het voorbeeld beschikbaar op de URL //localhost:8080/jws/index.html.