Kompilering av Java * .class-filer med javac

1. Oversikt

Denne opplæringen vil introdusere javac verktøyet og beskriver hvordan du bruker det til å kompilere Java-kildefiler til klassefiler.

Vi kommer i gang med en kort beskrivelse av javac kommandoen, og undersøk verktøyet mer grundig ved å se på de forskjellige alternativene.

2. Den javac Kommando

Vi kan spesifisere alternativer og kildefiler når vi kjører javac verktøy:

javac [opsjoner] [kildefiler]

Hvor [opsjoner] betegner alternativene som styrer operasjonene til verktøyet, og [kildefiler] angir en eller flere kildefiler som skal kompileres.

Alle alternativene er faktisk helt valgfrie. Kildefiler kan spesifiseres direkte som argumenter for javac kommandoen eller oppbevares i en referert argumentfil som beskrevet senere. Legg merke til at kildefiler skal ordnes i et kataloghierarki som tilsvarer de fullstendige navnene på typene de inneholder.

Alternativer for javac er kategorisert i tre grupper: standard, kryss-kompilering og ekstra. I denne artikkelen vil vi fokusere på standard og ekstra alternativer.

Tverskompilasjonsalternativene brukes til mindre vanlig bruk av kompilering av typedefinisjoner mot en JVM-implementering som er forskjellig fra kompilatorens miljø og vil ikke bli adressert.

3. Skriv definisjon

La oss starte med å introdusere klassen vi skal bruke for å demonstrere javac alternativer:

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

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

Merk at vi bruker * nix-filseparatorer i denne artikkelen; på Windows-maskiner, må vi bruke omvendt skråstrek (‘\') i stedet for skråstrek fremover (‘/').

4. Standardalternativer

En av de mest brukte standardalternativene til javac kommandoen er -d, spesifisere destinasjonskatalogen for genererte klassefiler. Hvis en type ikke er en del av standardpakken, opprettes en katalogstruktur som gjenspeiler pakkens navn for å beholde klassefilen av den typen.

La oss utføre følgende kommando i katalogen som inneholder strukturen gitt i forrige seksjon:

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

De javac kompilatoren genererer klassefilen javac-target / com / baeldung / javac / Data.class. Vær oppmerksom på at på noen systemer javac oppretter ikke automatisk målkatalogen, altså javac-mål i dette tilfellet. Derfor kan det hende vi må gjøre det manuelt.

Her er et par andre ofte brukte alternativer:

  • -cp (eller -klassesti, –Klasse-sti) – spesifiserer hvor typene som kreves for å kompilere kildefilene våre finnes. Hvis dette alternativet mangler, og CLASSPATH miljøvariabelen ikke er satt, brukes den gjeldende arbeidskatalogen i stedet (som det var tilfelle i eksemplet ovenfor).
  • -p (eller –Modul-sti) – angir plasseringen til nødvendige applikasjonsmoduler. Dette alternativet gjelder bare for Java 9 og nyere - se denne veiledningen for en guide til Java 9-modulsystemet.

Hvis vi vil vite hva som skjer under en samleprosess, f.eks. hvilke klasser som er lastet og hvilke som er samlet, kan vi bruke -verbose alternativ.

Det siste standardalternativet vi dekker er argumentfilen. I stedet for å sende argumenter direkte til javac verktøyet, kan vi lagre dem i argumentfiler. Navnene på disse filene, foran “@ karakter, blir deretter brukt som kommandoargumenter.

Når javac kommando møter et argument som begynner med ‘@, tolker det følgende tegn som stien til en fil og utvider filens innhold til en argumentliste. Mellomrom og nye linjetegn kan brukes til å skille argumenter som er inkludert i en slik argumentfil.

La oss anta at vi har to filer, kalt alternativer, og typer, i javac-args katalog med følgende innhold:

De alternativer fil:

-d javac-target -verbose

De typer fil:

com / baeldung / javac / Data.java

Vi kan kompilere Data skriv som før med detaljmeldinger som er trykt på konsollen ved å utføre denne kommandoen:

javac @ javac-args / options @ javac-args / types

I stedet for å holde argumenter i separate filer, vi kan også lagre dem alle i en enkelt fil.

Anta at det er en fil som heter argumenter i javac-args katalog:

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

La oss mate denne filen til javac for å oppnå samme resultat som med de to separate filene før:

javac @ javac-args / argumenter

Legg merke til at alternativene vi har gått gjennom i denne delen er bare de vanligste. For en komplett liste over standarder javac alternativer, sjekk ut denne referansen.

5. Ekstra alternativer

Ekstra alternativer for javac er ikke-standardalternativer, som er spesifikke for den nåværende implementeringen av kompilatoren og kan endres i fremtiden. Som sådan vil vi ikke gå gjennom disse alternativene i detalj.

Imidlertid er det et alternativ som er veldig nyttig og verdt å nevne, -Xlint. For en fullstendig beskrivelse av den andre javac ekstra alternativer, følg denne lenken.

De -Xlint alternativet lar oss aktivere advarsler under kompilering. Det er to måter å spesifisere dette alternativet på kommandolinjen:

  • -Xlint - utløser alle anbefalte advarsler
  • -Xlint: nøkkel [, nøkkel] * - muliggjør spesifikke advarsler

Her er noen av de handeste -Xlint nøkler:

  • råtyper - advarer om bruk av råtyper
  • ukontrollert - advarer om ukontrollert drift
  • statisk - advarer om tilgangen til et statisk medlem fra et instansemedlem
  • rollebesetning - advarer mot unødvendige rollebesetninger
  • seriell - advarer om at serieklasser ikke har en serialversionUID
  • faller gjennom - advarer om fallet i en bytte om uttalelse

Lag nå en fil med navnet xlint-ops i javac-args katalog med følgende innhold:

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

Når du kjører denne kommandoen:

javac @ javac-args / xlint-ops

vi burde se råtyper og ukontrollert advarsler:

com / baeldung / javac / Data.java: 7: advarsel: [rawtypes] funnet rå type: ArrayList List textList = new ArrayList (); ^ manglende typeargumenter for generisk klasse ArrayList der E er en typevariabel: E utvider Objekt deklarert i klasse ArrayList com / baeldung / javac / Data.java: 7: advarsel: [ukontrollert] ukontrollert konvertering Liste textList = ny ArrayList (); ^ obligatorisk: Liste funnet: ArrayList ...

6. Konklusjon

Denne opplæringen gikk gjennom javac verktøy som viser hvordan du bruker alternativer for å administrere den typiske kompileringsprosessen.

I virkeligheten kompilerer vi vanligvis et program ved hjelp av en IDE eller et byggeverktøy i stedet for direkte å stole på javac. Imidlertid vil en solid forståelse av dette verktøyet tillate oss å tilpasse samlingen i avanserte bruksområder.

Som alltid kan kildekoden for denne opplæringen bli funnet på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found