Java 11-broncode voor één bestand

1. Inleiding

JDK 11, de implementatie van Java SE 11, uitgebracht in september 2018.

In deze zelfstudie behandelen we de nieuwe Java 11-functie voor het starten van broncodeprogramma's met één bestand.

2. Voor Java 11

Een programma met één bestand is een programma waarin het programma in een enkel bronbestand past.

Vóór Java 11 moesten we, zelfs voor een programma met één bestand, een proces in twee stappen volgen om het programma uit te voeren.

Als een bestand bijvoorbeeld HelloWorld.java bevat een klasse met de naam Hallo Wereld met een hoofd() methode, we zouden het eerst moeten compileren:

$ javac HelloWorld.java

Dit zou een klassenbestand genereren dat we zouden moeten draaien met behulp van het commando:

$ java HelloWorld Hallo Java 11!

Dergelijke programma's zijn standaard in de vroege stadia van het leren van Java of bij het schrijven van kleine hulpprogramma's. In deze context is het een beetje ceremonieel om het programma te moeten compileren voordat het wordt uitgevoerd.

Maar zou het niet geweldig zijn om in plaats daarvan een proces in één stap te hebben? Java 11 probeert dit op te lossen door ons in staat te stellen dergelijke programma's rechtstreeks vanaf de bron te draaien.

3. Starten van broncodeprogramma's voor één bestand

Vanaf Java 11 kunnen we de volgende opdracht gebruiken om een ​​programma met één bestand uit te voeren:

$ java HelloWorld.java Hallo Java 11!

Merk op hoe we de bestandsnaam van de Java-broncode hebben doorgegeven en niet de Java-klasse aan het Java opdracht.

De JVM compileert het bronbestand in het geheugen en voert vervolgens het eerste openbare bestand uit hoofd() methode die het vindt.

We krijgen compilatiefouten als het bronbestand fouten bevat, maar verder wordt het uitgevoerd alsof we het al hadden gecompileerd.

4. Opdrachtregelopties

Het Java-opstartprogramma introduceerde een nieuw bronbestand modus om deze functie te ondersteunen. De bronbestandmodus is ingeschakeld als aan een van de volgende twee voorwaarden wordt voldaan:

  1. Het eerste item op de opdrachtregel gevolgd door de JVM-opties is een bestandsnaam met de extensie .Java uitbreiding
  2. De opdrachtregel bevat de -bron versie optie

Als het bestand niet voldoet aan de standaard naamgevingsconventies voor Java-bronbestanden, moeten we de -bron keuze. We zullen in de volgende sectie meer over dergelijke bestanden praten.

Eventuele argumenten die achter de naam worden geplaatst van het bronbestand in de oorspronkelijke opdrachtregel worden doorgegeven aan de gecompileerde klasse wanneer deze wordt uitgevoerd.

We hebben bijvoorbeeld een bestand met de naam Addition.java dat een Toevoeging klasse. Deze klasse bevat een hoofd() methode die de som van zijn argumenten berekent:

$ java Addition.java 1 2 3

We kunnen ook opties als likes doorgeven -Klasse-pad voor de bestandsnaam:

$ java --class-path = / some-path Addition.java 1 2 3

Nu, we krijgen een foutmelding als er een klasse op het klassepad van de toepassing staat met dezelfde naam als de klasse die we uitvoeren.

Laten we bijvoorbeeld zeggen dat we op een bepaald moment tijdens de ontwikkeling het bestand in onze huidige werkdirectory hebben gecompileerd met Javac:

$ javac HelloWorld.java

We hebben nu allebei HelloWorld.java en HelloWorld.class aanwezig in de huidige werkdirectory:

$ ls HelloWorld.class HelloWorld.java

Maar als we proberen de bronbestandmodus te gebruiken, krijgen we een foutmelding:

$ java HelloWorld.java-fout: klasse gevonden op het pad van de toepassingsklasse: HelloWorld

5. Shebang-bestanden

Het is gebruikelijk in Unix-afgeleide systemen, zoals macOS en Linux om de "#!" instructie om een ​​uitvoerbaar scriptbestand uit te voeren.

Een shellscript begint bijvoorbeeld meestal met:

#! / bin / sh

We kunnen dan het script uitvoeren:

$ ./some_script

Dergelijke bestanden worden "shebang-bestanden" genoemd.

We kunnen nu Java-programma's met één bestand uitvoeren met hetzelfde mechanisme.

Als we het volgende aan het begin van een bestand toevoegen:

#! / pad / naar / java - bronversie

Laten we bijvoorbeeld de volgende code toevoegen aan een bestand met de naam toevoegen:

#! / usr / local / bin / java - bron 11 import java.util.Arrays; public class Toevoeging {public static void main (String [] args) {Integer sum = Arrays.stream (args) .mapToInt (Integer :: parseInt) .sum (); System.out.println (som); }}

En markeer het bestand als uitvoerbaar:

$ chmod + x toevoegen

Vervolgens kunnen we het bestand uitvoeren als een script:

$ ./add 1 2 3 6

We kunnen de launcher ook expliciet gebruiken om het shebang-bestand op te roepen:

$ java - bron 11 voeg 1 2 3 6 toe

De -bron optie is vereist, zelfs als deze al in het bestand aanwezig is. De shebang in het bestand wordt genegeerd en wordt behandeld als een normaal Java-bestand zonder de extensie .Java uitbreiding.

Echter, kunnen we een .Java bestand als een shebang-bestand, zelfs als het een geldige shebang bevat. Het volgende resulteert dus in een fout:

$ ./Addition.java ./Addition.java:1: fout: ongeldig teken: '#' #! / Usr / local / bin / java - bron 11 ^

Een laatste ding om op te merken over shebang-bestanden is dat de richtlijn het bestand platformafhankelijk maakt. Het bestand zal niet bruikbaar zijn op platforms zoals Windows, die het niet standaard ondersteunt.

6. Conclusie

In dit artikel hebben we de nieuwe broncodefunctie voor één bestand gezien die in Java 11 is geïntroduceerd.

Zoals gewoonlijk zijn codefragmenten te vinden op GitHub.