Het compileren van Java * .class-bestanden met javac

1. Overzicht

Deze tutorial introduceert het Javac tool en beschrijft hoe u deze kunt gebruiken om Java-bronbestanden te compileren in klassebestanden.

We gaan aan de slag met een korte beschrijving van het Javac commando en onderzoek de tool vervolgens dieper door naar de verschillende opties te kijken.

2. Het Javac Opdracht

We kunnen opties en bronbestanden specificeren bij het uitvoeren van het Javac hulpmiddel:

javac [opties] [bronbestanden]

Waar [opties] geeft de opties aan die de bewerkingen van de tool besturen, en [bronbestanden] geeft een of meer bronbestanden aan die moeten worden gecompileerd.

Alle opties zijn inderdaad geheel optioneel. Bronbestanden kunnen direct worden opgegeven als argumenten voor de Javac commando of bewaard in een argumentbestand waarnaar wordt verwezen, zoals later wordt beschreven. Merk op dat bronbestanden moeten worden gerangschikt in een directoryhiërarchie die overeenkomt met de volledig gekwalificeerde namen van de typen die ze bevatten.

Opties van Javac zijn onderverdeeld in drie groepen: standaard, cross-compilatie en extra. In dit artikel gaan we in op de standaard en extra opties.

De cross-compilatie-opties worden gebruikt voor het minder gebruikelijke gebruik van het compileren van typedefinities tegen een JVM-implementatie die verschilt van de omgeving van de compiler en zullen niet worden aangepakt.

3. Typ Definitie

Laten we beginnen met de introductie van de klas die we gaan gebruiken om de Javac opties:

openbare klasse Data {Lijst textList = nieuwe ArrayList (); openbare ongeldige addText (String-tekst) {textList.add (tekst); } openbare lijst getTextList () {retourneer this.textList; }}

De broncode wordt in het bestand geplaatst com / baeldung / javac / Data.java.

Merk op dat we in dit artikel * nix-bestandsscheidingstekens gebruiken; op Windows-computers moeten we de backslash (‘\') in plaats van de schuine streep (‘/').

4. Standaard opties

Een van de meest gebruikte standaardopties van de Javac commando is -d, het specificeren van de bestemmingsmap voor gegenereerde klassebestanden. Als een type geen deel uitmaakt van het standaardpakket, wordt een directorystructuur gemaakt die de naam van het pakket weergeeft om het klassenbestand van dat type te behouden.

Laten we de volgende opdracht uitvoeren in de directory met de structuur die in de vorige sectie is gegeven:

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

De Javac compiler genereert het class-bestand javac-target / com / baeldung / javac / Data.class. Merk op dat op sommige systemen Javac maakt niet automatisch de doelmap aan, namelijk javac-target in dit geval. Daarom is het mogelijk dat we dit handmatig moeten doen.

Hier zijn een paar andere veelgebruikte opties:

  • -cp (of -klassenpad, -Klasse-pad) – specificeert waar typen die nodig zijn om onze bronbestanden te compileren, kunnen worden gevonden. Als deze optie ontbreekt en het KLASPAD omgevingsvariabele is niet ingesteld, de huidige werkdirectory wordt in plaats daarvan gebruikt (zoals het geval was in het bovenstaande voorbeeld).
  • -p (of –Module-pad) – geeft de locatie van de benodigde applicatiemodules aan. Deze optie is alleen van toepassing op Java 9 en hoger - raadpleeg deze tutorial voor een gids voor het Java 9-modulesysteem.

Als we willen weten wat er aan de hand is tijdens een compilatieproces, bijv. welke klassen worden geladen en welke zijn gecompileerd, kunnen we de -verbose keuze.

De laatste standaardoptie die we zullen behandelen, is het argumentbestand. In plaats van argumenten rechtstreeks door te geven aan de Javac tool, kunnen we ze opslaan in argumentbestanden. De namen van die bestanden, voorafgegaan door de ‘@ karakter, worden dan gebruikt als commando-argumenten.

Wanneer de Javac commando komt een argument tegen dat begint met ‘@, interpreteert het de volgende tekens als het pad naar een bestand en breidt het de inhoud van het bestand uit tot een argumentenlijst. Spaties en tekens voor nieuwe regels kunnen worden gebruikt om argumenten in een dergelijk argumentbestand te scheiden.

Laten we aannemen dat we twee bestanden hebben, genaamd opties, en types, in de javac-args directory met de volgende inhoud:

De opties het dossier:

-d javac-target -verbose

De types het dossier:

com / baeldung / javac / Data.java

We kunnen het Gegevens typ zoals eerder met gedetailleerde berichten die op de console zijn afgedrukt door deze opdracht uit te voeren:

javac @ javac-args / opties @ javac-args / types

In plaats van argumenten in aparte bestanden te bewaren, we kunnen ze ook allemaal in één bestand opslaan.

Stel dat er een bestand is met de naam argumenten in de javac-args directory:

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

Laten we dit bestand naar Javac om hetzelfde resultaat te bereiken als met de twee afzonderlijke bestanden ervoor:

javac @ javac-args / arguments

Merk op dat de opties die we in deze sectie hebben doorlopen, alleen de meest voorkomende zijn. Voor een complete lijst met standaard Javac opties, bekijk dan deze referentie.

5. Extra opties

Extra opties van Javac zijn niet-standaard opties, die specifiek zijn voor de huidige implementatie van de compiler en die in de toekomst kunnen worden gewijzigd. Daarom zullen we deze opties niet in detail bespreken.

Er is echter een optie die erg handig en het vermelden waard is, -Xlint. Voor een volledige beschrijving van de ander Javac extra opties, volg deze link.

De -Xlint optie stelt ons in staat om waarschuwingen tijdens het compileren in te schakelen. Er zijn twee manieren om deze optie op de opdrachtregel op te geven:

  • -Xlint - activeert alle aanbevolen waarschuwingen
  • -Xlint: sleutel [, sleutel] * - maakt specifieke waarschuwingen mogelijk

Hier zijn enkele van de handigste -Xlint sleutels:

  • rawtypes - waarschuwt voor het gebruik van onbewerkte soorten
  • niet aangevinkt - waarschuwt voor niet-gecontroleerde bewerkingen
  • statisch - waarschuwt voor de toegang tot een statisch lid van een instantielid
  • gips - waarschuwt voor onnodige worpen
  • serieel - waarschuwt voor serialiseerbare klassen die geen serialversionUID
  • doorval - waarschuwt voor het doorvallen in een schakelaar uitspraak

Maak nu een bestand met de naam xlint-ops in de javac-args directory met de volgende inhoud:

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

Bij het uitvoeren van deze opdracht:

javac @ javac-args / xlint-ops

we zouden de rawtypes en niet aangevinkt waarschuwingen:

com / baeldung / javac / Data.java: 7: waarschuwing: [rawtypes] gevonden ruw type: ArrayList List textList = nieuwe ArrayList (); ^ ontbrekende type-argumenten voor generieke klasse ArrayList waarbij E een typevariabele is: E breidt Object gedeclareerd in klasse ArrayList com / baeldung / javac / Data.java: 7: waarschuwing: [niet aangevinkt] niet-aangevinkte conversie List textList = new ArrayList (); ^ vereist: lijst gevonden: ArrayList ...

6. Conclusie

Deze tutorial liep door het Javac tool, die laat zien hoe u opties kunt gebruiken om het typische compilatieproces te beheren.

In werkelijkheid compileren we een programma meestal met behulp van een IDE of een build-tool in plaats van er rechtstreeks op te vertrouwen Javac. Een gedegen kennis van deze tool stelt ons echter in staat om de compilatie aan te passen in geavanceerde gebruiksscenario's.

Zoals altijd is de broncode voor deze tutorial te vinden op GitHub.