En guide till Java Web Start

1. Översikt

Den här artikeln förklarar vad Java Web Start (JWS) är, hur man konfigurerar det på serversidan och hur man skapar ett enkelt program.

Obs! JWS har tagits bort från Oracle JDK från och med Java 11. Som ett alternativ, överväg att använda OpenWebStart.

2. Inledning

JWS är en runtime-miljö som kommer med Java SE för klientens webbläsare och har funnits sedan Java version 5.

Med nedladdningen av JNLP-filerna (även känd som Java Network Launch Protocol) från webbservern tillåter denna miljö oss att köra JAR-paket som det hänvisas till på distans.

Enkelt uttryckt, mekanismen laddar och kör Java-klasser på en klients dator med en vanlig JRE-installation. Det tillåter också några extra instruktioner från Jakarta EE. Säkerhetsrestriktioner tillämpas strikt av klientens JRE, varnar vanligtvis användaren för opålitliga domäner, brist på HTTPS och till och med osignerade JAR.

Från en generisk webbplats kan man ladda ner en JNLP-fil för att utföra en JWS-applikation. När den väl har laddats ner kan den köras direkt från en genväg på skrivbordet eller Java Cache Viewer. Därefter laddas ner och kör JAR-filer.

Denna mekanism kan vara till stor hjälp för att leverera ett grafiskt gränssnitt som inte är webbaserat (HTML-fritt), till exempel en säker filöverföringsapplikation, en vetenskaplig kalkylator, ett säkert tangentbord, en lokal bildwebbläsare och så vidare.

3. En enkel JNLP-applikation

Ett bra tillvägagångssätt är att skriva en applikation och paketera den i en WAR-fil för vanliga webbservrar. Allt vi behöver är att skriva vår önskade applikation (vanligtvis med Swing) och paketera den i en JAR-fil. Denna JAR måste sedan i sin tur förpackas i en WAR-fil tillsammans med en JNLP som referens, ladda ner och köra sin programmets huvud klass normalt.

Det är ingen skillnad med en vanlig webbapplikation som är förpackad i en WAR-fil, förutom det faktum att vi behöver en JNLP-fil för att aktivera JWS, vilket kommer att visas nedan.

3.1. Java-applikation

Låt oss börja med att skriva en enkel Java-applikation:

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

Vi kan se att detta är en ganska enkel Swing-klass. Faktum är att inget lades till för att göra det JWS-kompatibelt.

3.2. Webbapplikation

Allt vi behöver är att JAR paketera detta exempel Swing-klass till en WAR-fil tillsammans med följande JNLP-fil:

   Hello Example       

Låt oss namnge det hej.jndl och placera det under vilken webbmapp som helst i vår krig. Både JAR och WAR är nedladdningsbara, så vi behöver inte oroa oss för att placera JAR i en lib- mapp.

URL-adressen till vår slutliga JAR är hårt kodad i JNLP-filen, vilket kan orsaka vissa distributionsproblem. Om vi ​​byter distributionsservrar fungerar inte applikationen längre.

Låt oss fixa det med en ordentlig servlet senare i den här artikeln. För nu, låt oss bara placera JAR-filen för nedladdning i rotmappen som index.html och länka den till ett ankarelement:

Launch

Låt oss också sätta huvudklassen i vårt JAR-manifest . Detta kan uppnås genom att konfigurera JAR-plugin i filen pom.xml . På samma sätt flyttar vi JAR-filen utanför WEB-INF / lib , eftersom den endast är avsedd för nedladdning, dvs. inte för klassladdaren:

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

4. Särskilda konfigurationer

4.1. Säkerhetsproblem

För att köra en applikation måste vi underteckna JAR . Att skapa ett giltigt certifikat och använda JAR Sign Maven Plugin går utöver denna artikel, men vi kan kringgå denna säkerhetspolicy för utvecklingsändamål, eller om vi har administrativ åtkomst till vår användares dator.

För att göra det måste vi lägga till den lokala URL: en (till exempel: // localhost: 8080 ) i listan över säkerhetsundantag för JRE-installationen på den dator där applikationen ska köras. Det kan hittas genom att öppna Java-kontrollpanelen (i Windows kan vi hitta den via kontrollpanelen) på fliken Säkerhet.

5. JnlpDownloadServlet

5.1. Kompressionsalgoritmer

Det finns en speciell servlet som kan inkluderas i vår krig. Det optimerar nedladdningen genom att leta efter den mest komprimerade kompilerade versionen av vår JAR-fil om den är tillgänglig, och fixa också det hårdkodade kodbaserade värdet på JLNP-filen.

Eftersom vår JAR kommer att finnas tillgänglig för nedladdning är det tillrådligt att paketera den med en komprimeringsalgoritm, till exempel Pack200, och leverera den vanliga JAR och alla JAR.PACK.GZ eller JAR.GZ komprimerade versioner i samma mapp så att denna servlet välj det bästa alternativet för varje fall.

Tyvärr finns det ingen stabil version av ett Maven-plugin ännu för den här komprimeringsalgoritmen, men vi kan arbeta med den körbara Pack200-versionen som kommer med JRE (vanligtvis installerad på sökvägen {JAVA_SDK_HOME} / jre / bin / ).

Utan att ändra vår JNLP och genom att placera jar.gz- och jar.pack.gz- versionerna av JAR i samma mapp, väljer servlet den bättre när den får ett samtal från en fjärransluten JNLP. Detta förbättrar användarupplevelsen och optimerar nätverkstrafiken.

5.2. Codebase Dynamic Substitution

Servleten kan också utföra dynamiska ersättningar för hårdkodade URL-adresser i märka. Genom att ändra JNLP till jokertecken, levererar den samma slutliga renderade taggen.

Servleten fungerar också med jokertecken $$ codebase , $$ värdnamn , $$ namn och $$ webbplats , vilket kommer att lösa " // localhost: 8080 / jnlp-exempel / ", " localhost: 8080 ", " hello.jnlp " respektive “ // localhost: 8080 ”.

5.3. Lägga till Servlet till Classpath

För att lägga till servleten, låt oss konfigurera en normal servletmappning för JAR- och JNLP-mönster till vår web.xml :

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

Själva servleten finns i en uppsättning JAR ( jardiff.jar och jnlp-servlet.jar ) som numera finns i avsnittet Demos & Samples på Java SDK-hämtningssidan.

I GitHub-exemplet ingår dessa filer i mappen java-core-samples-lib och ingår som webbresurser av plugin-programmet Maven WAR:

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

6. Slutliga tankar

Java Web Start är ett verktyg som kan användas i (intranät) miljöer där det inte finns någon applikationsserver. Även för applikationer som behöver manipulera lokala användarfiler.

En applikation skickas till slutanvändaren av ett enkelt nedladdningsprotokoll, utan ytterligare beroenden eller konfiguration, förutom vissa säkerhetsproblem (HTTPS, signerad JAR, etc.).

I Git-exemplet finns den fullständiga källkoden som beskrivs i den här artikeln tillgänglig för nedladdning. Vi kan ladda ner det direkt från GitHub till ett operativsystem med Tomcat och Apache Maven. Efter nedladdning måste vi köra kommandot mvn install från källkatalogen och kopiera den genererade jws.war- filen från målet till mappen webapps för Tomcat-installationen.

Efter det kan vi starta Tomcat som vanligt.

Från en standard Apache Tomcat-installation kommer exemplet att finnas på URL: n //localhost:8080/jws/index.html .