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.