Kompilering af Java * .class-filer med javac

1. Oversigt

Denne vejledning introducerer javac værktøj og beskriver, hvordan man bruger det til at kompilere Java-kildefiler til klassefiler.

Vi kommer i gang med en kort beskrivelse af javac kommando, og undersøge derefter værktøjet mere dybtgående ved at se på dets forskellige muligheder.

2. Den javac Kommando

Vi kan specificere indstillinger og kildefiler, når vi udfører javac værktøj:

javac [optioner] [kildefiler]

Hvor [muligheder] angiver de muligheder, der styrer værktøjet, og [kildefiler] angiver en eller flere kildefiler, der skal kompileres.

Alle muligheder er faktisk helt valgfri. Kildefiler kan angives direkte som argumenter for javac kommando eller opbevares i en refereret argumentfil som beskrevet senere. Bemærk, at kildefiler skal arrangeres i et kataloghierarki svarende til de fuldt kvalificerede navne på de typer, de indeholder.

Indstillinger for javac er kategoriseret i tre grupper: standard, krydssamling og ekstra. I denne artikel vil vi fokusere på standard og ekstra muligheder.

Indstillingerne for kryds-kompilering bruges til det mindre almindelige tilfælde af kompilering af typedefinitioner mod en JVM-implementering, der er forskellig fra kompilatorens miljø og vil ikke blive behandlet.

3. Skriv definition

Lad os starte med at introducere den klasse, vi skal bruge til at demonstrere javac muligheder:

offentlig klasse Data {List textList = new ArrayList (); public void addText (String text) {textList.add (text); } offentlig liste getTextList () {returner this.textList; }}

Kildekoden placeres i filen com / baeldung / javac / Data.java.

Bemærk, at vi bruger * nix-filseparatorer i denne artikel; på Windows-maskiner, skal vi bruge tilbageslag ('\') i stedet for den skråstreg fremad ('/').

4. Standardindstillinger

En af de mest almindelige standardindstillinger for javac kommando er -d, angivelse af destinationsmappen for genererede klassefiler. Hvis en type ikke er en del af standardpakken, oprettes en biblioteksstruktur, der afspejler pakkens navn, for at holde klassefilen af ​​den type.

Lad os udføre følgende kommando i mappen, der indeholder strukturen, der er angivet i det foregående afsnit:

javac -d javac-target com / baeldung / javac / Data.java

Det javac compiler genererer klassefilen javac-target / com / baeldung / javac / Data.class. Bemærk, at på nogle systemer javac opretter ikke automatisk målmappen, hvilket er javac-mål I dette tilfælde. Derfor er vi muligvis nødt til at gøre det manuelt.

Her er et par andre ofte anvendte muligheder:

  • -cp (eller -klassesti, –Klasse-sti) – angiver, hvor typer der kræves for at kompilere vores kildefiler kan findes. Hvis denne mulighed mangler, og CLASSPATH miljøvariabel er ikke indstillet, den aktuelle arbejdsmappe bruges i stedet (som det var tilfældet i eksemplet ovenfor).
  • -p (eller –Modul-sti) – angiver placeringen af ​​nødvendige applikationsmoduler. Denne mulighed gælder kun for Java 9 og derover - se denne vejledning for en guide til Java 9-modulsystemet.

Hvis vi vil vide, hvad der foregår under en kompileringsproces, f.eks. hvilke klasser der er indlæst, og hvilke der er samlet, kan vi anvende -ordrig mulighed.

Den sidste standardmulighed, vi dækker, er argumentfilen. I stedet for at sende argumenter direkte til javac værktøj, kan vi gemme dem i argumentfiler. Navnene på disse filer, foran "@ karakter, bruges derefter som kommandoargumenter.

Når javac kommando støder på et argument, der starter med ‘@, fortolker det følgende tegn som stien til en fil og udvider filens indhold til en argumenteliste. Mellemrum og nye linjetegn kan bruges til at adskille argumenter, der er inkluderet i en sådan argumentfil.

Lad os antage, at vi har to filer, der hedder mulighederog typer, i javac-args bibliotek med følgende indhold:

Det muligheder fil:

-d javac-target -verbose

Det typer fil:

com / baeldung / javac / Data.java

Vi kan sammensætte Data skriv som før med detaljerede meddelelser udskrevet på konsollen ved at udføre denne kommando:

javac @ javac-args / optioner @ javac-args / typer

I stedet for at opbevare argumenter i separate filer, vi kan også gemme dem alle i en enkelt fil.

Antag at der er en fil med navnet argumenter i javac-args vejviser:

-d javac-target -verbose com / baeldung / javac / Data.java

Lad os give denne fil til javac for at opnå det samme resultat som med de to separate filer før:

javac @ javac-args / argumenter

Bemærk, at de muligheder, vi har gennemgået i dette afsnit, kun er de mest almindelige. For en komplet liste over standarder javac valgmuligheder, tjek denne reference.

5. Ekstra muligheder

Ekstra muligheder for javac er ikke-standardindstillinger, som er specifikke for den aktuelle implementering af compiler og kan ændres i fremtiden. Som sådan vil vi ikke gå igennem disse muligheder detaljeret.

Der er dog en mulighed, der er meget nyttig og værd at nævne, -Xlint. For en fuld beskrivelse af den anden javac ekstra muligheder, følg dette link.

Det -Xlint mulighed giver os mulighed for at aktivere advarsler under kompilering. Der er to måder at specificere denne mulighed på kommandolinjen:

  • -Xlint - udløser alle anbefalede advarsler
  • -Xlint: nøgle [, nøgle] * - muliggør specifikke advarsler

Her er nogle af de smukkeste -Xlint nøgler:

  • råtyper - advarer om brugen af ​​rå typer
  • ikke markeret - advarer om ukontrollerede operationer
  • statisk - advarer om adgangen til et statisk medlem fra et instansmedlem
  • støbt - advarer om unødvendige rollebesætninger
  • seriel - advarer om, at klasser, der kan serialiseres, ikke har en serialversionUID
  • falder gennem - advarer om faldet i en kontakt udmelding

Opret nu en fil med navnet xlint-ops i javac-args bibliotek med følgende indhold:

-d javac-target -Xlint: rawtypes, ukontrolleret com / baeldung / javac / Data.java

Når du kører denne kommando:

javac @ javac-args / xlint-ops

vi skal se råtyper og ikke markeret advarsler:

com / baeldung / javac / Data.java: 7: advarsel: [råtyper] fundet rå type: ArrayList Liste textList = ny ArrayList (); ^ manglende typeargumenter for generisk klasse ArrayList, hvor E er en typevariabel: E udvider Objekt, der er erklæret i klasse ArrayList com / baeldung / javac / Data.java: 7: advarsel: [ikke markeret] ukontrolleret konvertering Liste textList = ny ArrayList (); ^ krævet: Liste fundet: ArrayList ...

6. Konklusion

Denne tutorial gik gennem javac værktøj, der viser, hvordan man bruger indstillinger til at styre den typiske kompileringsproces.

I virkeligheden kompilerer vi normalt et program ved hjælp af en IDE eller et build-værktøj i stedet for direkte at stole på javac. En solid forståelse af dette værktøj giver os dog mulighed for at tilpasse kompilering i avancerede brugssager.

Som altid kan kildekoden til denne vejledning findes på GitHub.