Java 9 introducerede ideen om modulære runtime-billeder med Project Jigsaw og løste officielt problemet med at sende Java-runtime som monolitiske artefakter. Monolitiske runtime-billeder var ikke kun tunge på hukommelsesbrug, men svækkede også den generelle ydeevne af den applikation, der kørte på den. Vi kan nu pakke et tilpasset undersæt af JRE, baseret på de individuelle behov for de applikationer, der kører på det, og øge deres effektivitetsmanifold. Denne artikel tager et holistisk blik på denne funktion af brugerdefinerede runtime-billeder introduceret med Java 9.
En oversigt
Virkningen af ideen om at skabe et modulært runtime-billede med Java 9 er enorm. Det åbner døren for en specialbygget applikation lige fra den platform, den kører på. Java-platformen øger sin funktionalitet med hver ny version. Det er ikke en overraskelse, at køretiden på et tidspunkt vil være en monolitisk artefakt og tage hårdt på hukommelse og ydeevne. På grund af dette har udviklere længe efterspurgt en vej ud af dette problem. De fleste programmer bruger heller ikke Java Platform i sin helhed. Hvis et program kan optimeres til ydeevne og hukommelsesbrug, hvorfor kan den platform, det kører på, så ikke også tilpasses? Java 8 tog det første skridt og forsøgte at implementere nogle aspekter af det med kompakte profiler . Java 9 tog det fremad og implementerede en måde at tilpasse runtime-billeder uden begrænsninger som kompakte profiler pålagt. Det tog en holistisk tilgang til emballering af runtime-billeder. Selve platformen er modulopbygget for at aktivere denne funktion. Applikationskode pakket i moduler kan sendes med brugerdefinerede runtime-billeder, der kun indeholder de platformmoduler, som bruges af applikationen. Et applikationsprogram kan således være en enkelt bundtet artefakt, som inkluderer den brugerdefinerede JRE. Dette udnytter helt sikkert ydeevnen og giver en opstartstid med færre hukommelsesfodspor. Hvis applikationen kører i skyen, reducerer disse netværksoverbelastningen og downloadtiden betydeligt.
Kompakt profil
Selvom Java 9 kom forbi konceptet kompakt profil introduceret med Java 8, er det ofte nyttigt at forstå og værdsætte den nåede milepæl. På en måde brød Java 9 med ideen og opgraderede konceptet med en kompakt profil på en mere holistisk måde.
En kompakt profil definerer undersæt af Java SE platform API, der kan reducere den statiske størrelse af Java runtime. Denne idé er grundlæggende rettet mod at arbejde på ressourcebegrænsede enheder, som har mindre lagerkapacitet, såsom en indlejret enhed. Der er grundlæggende tre profiler, kaldet compact1 , kompakt2 , og compact3 . Hver højere nummereret profil er et supersæt af dens lavere nummererede profil. Det betyder, at compact1 er en korrekt undergruppe af compact2 , kompakt2 er en korrekt undergruppe af compact3 , og compact3 , til gengæld er en ordentlig undergruppe af den fulde stack Java 8 SE API.
Referencer:
- Kompakte profiler, Java SE 8-dokumentation
- Java SE Embedded 8 Compact Profiles Oversigt
- En introduktion til Java 8 Compact-profiler
Vi præsenterer JIMAGE
JIMAGE er et specielt filformat introduceret med Java 9 til at gemme brugerdefinerede runtime-billeder. Dette filformat er optimeret til ydeevne og lagring. Filformatet fungerer grundlæggende som en container for JDK-ressourcer, klasser og moduler og indekserer dem til hurtig søgning og hurtigere indlæsning af klasse. I modsætning til andre filformater såsom JAR'er og JMOD'er, bruges JIMAGE sjældent af udviklere, da det relaterer til JDK-internet, undtagen når man ønsker at bygge et brugerdefineret runtime-billede. Klasseindlæsning er hurtigere med JIMAGE end JAR'er eller JMOD'er, da den er specifikt optimeret til det. Desuden kan JIMAGE kun bruges under kørsel. JIMAGE er stadig i sine tidlige år. Der er meget lidt udviklerinformation tilgængelig; måske vil mere blive afsløret senere.
Oprettelse af brugerdefinerede billeder
Java 9 leverer jlink værktøj til at skabe platformspecifikke runtime-billeder. Brugerdefinerede billeder indeholder applikationsspecifikke moduler og de nødvendige moduler på platformen. Da størrelsen af runtime-billedet alias JRE er reduceret til et absolut minimum, er applikationsbilledet sammen med JRE også minimalt. Det samler JRE som en enkelt leveringsenhed sammen med programmet. jlink værktøj er placeret i /bin bibliotek af JDK9 installeret mappe. Der er flere tilgængelige muligheder, der er forbundet med dette værktøj, som kan bruges i henhold til kravet. Beskrivelsen kan fås ved at bruge –hjælp mulighed tilgængelig med jlink kommando. Her er det udtrukket for nemheds skyld, eller du kan skrive jlink –help i kommandolinjen for at få den følgende liste.
Brug:
jlink <options> --module-path <modulepath> --add-modules <module>[,<module>...]
Mulighed | Beskrivelse |
–tilføj-moduler | Root-moduler, der skal løses |
–bind-tjenester | Link i tjenesteudbydermoduler og deres afhængigheder |
-c, –compress=<0|1|2>
–disable-plugin
–endian | Aktiver komprimering af ressourcer: Niveau 0:Ingen komprimering Niveau 1:Konstant strengdeling Niveau 2:ZIP Deaktiver det nævnte plug-in Byte rækkefølge af genereret jimage (standard:indfødt) |
-h, –hjælp –ignorer-signing-information
–launcher
–limit-moduler –list-plug-ins | Udskriv denne hjælpemeddelelse Undertrykk en fatal fejl, når signerede modulære JAR'er er linket i billedet. De signaturrelaterede filer for de signerede modulære JAR'er kopieres ikke til runtime-billedet. Tilføj en startkommando med det givne navn for modulet og hovedklassen, hvis det er angivet. Begræns universet af observerbare moduler. Liste over tilgængelige plug-ins. |
-p, –modul-sti –no-header-filer –no-man-pages
–output
–save-opts | Modulsti Udelad inkludere header-filer Ekskluder man-sider Placering af outputsti Gem jlink-indstillinger i den givne fil |
-G, –strip-debug
–suggest-providers [ | Fjern fejlretningsoplysninger Foreslå udbydere, der implementerer de givne servicetyper fra modulstien |
-v, –verbose –version
@ | Aktiver udførlig sporing Versionsoplysninger Læs muligheder fra fil |
Et simpelt eksempel
Her vil vi gennemgå et meget simpelt program fra begyndelsen til slutningen af, hvordan man opretter et runtime-billede af en Java-applikation. Vi antager, at JDK9 er korrekt installeret og PATH og JAVA_HOME miljøvariablen er indstillet korrekt. I mit tilfælde er det installeret og indstillet som følger (på en Linux-platform):
- JDK9 installeret mappe /usr/lib/jvm/java-9-oracle
- STI er indstillet til /usr/lib/jvm/java-9-oracle/bin
- JAVA_HOME er indstillet til /usr/lib/jvm/java-9-oracle
Trin 1
Opret en mappe med navnet /Home/SampleProject og en src mappe inde i den (f.eks. /Home/SampleProject/src ).
Trin 2
Opret en mappe med navnet org.app.test inde i kilden bibliotek (som et eksempel, /Home/SampleProject/src/org.app.test ).
Trin 3
Nu inde i org.app.test mappe, skal du oprette en fil med navnet module-info.java . Og skriv følgende indhold:
module org.app.test{ requires javafx.controls; exports org.app.test; }
Trin 4
Opret nu en mappe med navnet org, app, test en inde i en anden (f.eks. org.app.test/org/app/test ) og opret derefter en fil med navnet MyApplication.java inde i testen mappe og skriv følgende indhold:
package org.app.test; import javafx.application.Application; import javafx.scene.control.Alert; import javafx.scene.control.ButtonType; import javafx.stage.Stage; public class MyApplication extends Application{ public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) throws Exception { Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle("Congratulation!"); alert.setHeaderText("You did it. The application is running. Press OK to close"); alert.setContentText("You have successfully created a custom image"); alert.showAndWait().ifPresent(rs -> { if (rs == ButtonType.OK) { System.out.println("Pressed OK."); } }); } }
Trin 5
Opret et /Home/SampleProject/mods vejviser. Her gemmer vi den kompilerede kode. Kompiler kildekoden som følger. Den nuværende arbejdsmappe er /Home/SampleProject .
javac -d mods --module-source-path src src/org.app.test/module-info.java src/org.app.test/org/app/test/MyApplication.java
Trin 6
Lad os nu oprette JAR-filen og gemme den i lib mappe (såsom /Home/SampleProject/lib ) som følger:
jar --create --file lib/org.app.test.jar --main-class org.app.test.MyApplication -C mods/org.app.test .
Trin 7
For at teste skal du køre programmet som følger:
java --module-path lib -m org.app.test
Trin 8
Lad os nu oprette JMOD-filen og gemme den i jmods mappe (f.eks. Hjem/SampleProject/jmods ):
jmod create --class-path lib/org.app.test.jar jmods/org.app.test.jmod
Trin 9
Lad os endelig oprette det brugerdefinerede billede ved at bruge følgende kommando:
jlink --module-path /usr/lib/jvm/java-9-oracle/jmods/:jmods --add-modules org.app.test --launcher runapp=org.app.test --output dist
Dette vil oprette en mappe med navnet dist som indeholder alt hvad der kræves for at køre programmet. Programmet med launcher-navnet angivet som runapp , er indeholdt i dist/bin vejviser. Dobbeltklik på det for at køre.
Figur 1: Programmet kører
Det er alt.
Konklusion
Se den relevante dokumentation for en detaljeret beskrivelse af hver af de kommandomuligheder, der bruges i denne artikel. Prøv et simpelt program og byg det fra start til slut. Dette ville opbygge den nødvendige tillid til at eksperimentere med et lidt mere kompliceret program, såsom at bruge mere end ét modul og håndtere deres afhængigheder. JDK9 har bemyndiget udviklere til at forberede sin runtime-bagage til kun at blive fyldt med nødvendige moduler. Dette er fantastisk og fremragende, noget de fleste af os har forventet fra Java i lang tid. En Java-applikation kan nu trække på den bagage, den måtte bære af tilsyneladende ringe grund og blive platformsoptimeret i distribution.