En guide til Java Web Start

1. Oversikt

Denne artikkelen forklarer hva Java Web Start (JWS) er, hvordan du konfigurerer det på serversiden, og hvordan du lager et enkelt program.

Merk: JWS er ​​fjernet fra Oracle JDK fra og med Java 11. Som et alternativ, bør du vurdere å bruke OpenWebStart.

2. Introduksjon

JWS er ​​et kjøretidsmiljø som følger med Java SE for klientens nettleser og har eksistert siden Java versjon 5.

Med nedlasting av JNLP-filene (også kjent som Java Network Launch Protocol) fra webserveren, gir dette miljøet oss muligheten til å kjøre JAR-pakker som det refereres til fra den eksternt.

Enkelt sagt, mekanismen laster og kjører Java-klasser på en klients datamaskin med en vanlig JRE-installasjon. Det tillater også noen ekstra instruksjoner fra Jakarta EE. Imidlertid er sikkerhetsbegrensninger strengt brukt av klientens JRE, som vanligvis advarer brukeren om upålitelige domener, mangel på HTTPS og til og med usignerte JARer.

Fra et generelt nettsted kan man laste ned en JNLP-fil for å utføre en JWS-applikasjon. Når den er lastet ned, kan den kjøres direkte fra en snarvei på skrivebordet eller Java Cache Viewer. Etter det laster den ned og kjører JAR-filer.

Denne mekanismen kan være veldig nyttig for å levere et grafisk grensesnitt som ikke er nettbasert (HTML-fritt), for eksempel en sikker filoverføringsapplikasjon, en vitenskapelig kalkulator, et sikkert tastatur, en lokal bildebrowser og så videre.

3. En enkel JNLP-applikasjon

En god tilnærming er å skrive et program og pakke det inn i en WAR-fil for vanlige webservere. Alt vi trenger er å skrive ønsket applikasjon (vanligvis med Swing) og pakke den inn i en JAR-fil. Denne JAR-en må da i sin tur pakkes inn i en WAR-fil sammen med en JNLP som vil referere, laste ned og utføre applikasjonens Hoved klasse normalt.

Det er ingen forskjell med en vanlig webapplikasjon pakket i en WAR-fil, bortsett fra det faktum at vi trenger en JNLP-fil for å aktivere JWS, som vist nedenfor.

3.1. Java-applikasjon

La oss starte med å skrive en enkel Java-applikasjon:

offentlig klasse Hei {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-etikett = ny JLabel ("Hello World"); f.add (etikett); f.setVisible (true); }}

Vi kan se at dette er en ganske grei Swing-klasse. Faktisk ble ingenting lagt til for å gjøre det JWS-kompatibelt.

3.2. Webapplikasjon

Alt vi trenger er å JAR pakke dette eksemplet Swing-klasse til en WAR-fil sammen med følgende JNLP-fil:

   Hei Eksempel 

La oss nevne det hei.jndl og plasser den under en hvilken som helst nettmappe i krigen. Både JAR og WAR kan lastes ned, så vi trenger ikke bekymre oss for å sette JAR i en lib mappe.

URL-adressen til vår endelige JAR er hardkodet i JNLP-filen, noe som kan forårsake noen distribusjonsproblemer. Hvis vi bytter distribusjonsservere, fungerer ikke applikasjonen lenger.

La oss fikse det med en skikkelig servlet senere i denne artikkelen. For nå, la oss bare plassere JAR-filen for nedlasting i rotmappen som index.html, og knytt det til et ankerelement:

Start

La oss også sette hovedklassen i vårt JAR-manifest. Dette kan oppnås ved å konfigurere JAR-pluginet i pom.xml fil. På samme måte flytter vi JAR-filen utenfor WEB-INF / lib, siden det bare er ment for nedlasting, dvs. ikke for klasselaster:

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

4. Spesielle konfigurasjoner

4.1. Sikkerhetsproblemer

For å kjøre et program, vi trenger å signere JAR. Å lage et gyldig sertifikat og bruke JAR Sign Maven Plugin går utover omfanget av denne artikkelen, men vi kan omgå denne sikkerhetspolitikken for utviklingsformål, eller hvis vi har administrativ tilgang til brukerens datamaskin.

For å gjøre dette må vi legge til den lokale URL-en (for eksempel: // lokal vert: 8080) til listen over sikkerhets unntak for JRE-installasjonen på datamaskinen der applikasjonen skal kjøres. Det kan bli funnet ved å åpne Java Kontrollpanel (på Windows, vi kan finne det via Kontrollpanel) i kategorien Sikkerhet.

5. Den JnlpDownloadServlet

5.1. Komprimeringsalgoritmer

Det er en spesiell servlet som kan inkluderes i vår KRIG. Det optimaliserer nedlastingen ved å se etter den mest komprimerte kompilerte versjonen av JAR-filen vår, hvis den er tilgjengelig, og også fikse den hardkodede kodebase verdi på JLNP-filen.

Siden JAR vår vil være tilgjengelig for nedlasting, er det tilrådelig å pakke den med en komprimeringsalgoritme, for eksempel Pack200, og levere den vanlige JAR og hvilken som helst JAR.PACK.GZ eller JAR.GZ komprimert versjon i samme mappe slik at denne servletten kan velg det beste alternativet for hvert tilfelle.

Dessverre er det ingen stabil versjon av et Maven-plugin ennå for denne komprimeringsalgoritmen, men vi kan jobbe med Pack200-kjørbarheten som følger med JRE (vanligvis installert på banen) {JAVA_SDK_HOME} / jre / bin /).

Uten å endre JNLP og ved å plassere jar.gz og jar.pack.gz versjoner av JAR i samme mappe, velger servletten den bedre når den får en samtale fra en ekstern JNLP. Dette forbedrer brukeropplevelsen og optimaliserer nettverkstrafikk.

5.2. Codebase Dynamic Substitution

Servletten kan også utføre dynamiske erstatninger for hardkodede nettadresser i stikkord. Ved å endre JNLP til jokertegnet , den leverer den samme endelige gjengitte koden.

Servetten fungerer også med jokertegnene $$ kodebase, $$ vertsnavn, $$ navn og $$ nettsted, som vil løse “// localhost: 8080 / jnlp-eksempel /“, “lokal vert: 8080“, “hei.jnlp“, Og“// lokal vert: 8080”Henholdsvis.

5.3. Legge til Servlet på Classpath

For å legge til servleten, la oss konfigurere en normal servletkartlegging for JAR- og JNLP-mønstre til vår web.xml:

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

Selve servetten kommer i et sett med JAR (jardiff.jar og jnlp-servlet.jar) som i dag er plassert i delen Demoer og eksempler på nedlastingssiden for Java SDK.

I GitHub-eksemplet er disse filene inkludert i java-core-samples-lib mappen og er inkludert som nettressurser av Maven WAR plugin:

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

6. Avsluttende tanker

Java Web Start er et verktøy som kan brukes i (intranett) miljøer der det ikke er noen applikasjonsserver. Også for applikasjoner som trenger å manipulere lokale brukerfiler.

Et program sendes til sluttbrukeren av en enkel nedlastingsprotokoll, uten ytterligere avhengigheter eller konfigurasjon, bortsett fra noen sikkerhetsproblemer (HTTPS, signert JAR, etc.).

I Git-eksemplet er den fullstendige kildekoden beskrevet i denne artikkelen tilgjengelig for nedlasting. Vi kan laste den ned direkte fra GitHub til et operativsystem med Tomcat og Apache Maven. Etter nedlasting må vi kjøre mvn installere kommandoen fra kildekatalogen og kopier den genererte jws.war fil fra mål til webapps mappen til Tomcat-installasjonen.

Etter det kan vi starte Tomcat som vanlig.

Fra en standard Apache Tomcat-installasjon vil eksemplet være tilgjengelig på URL-en //localhost:8080/jws/index.html.