Java >> Java tutorial >  >> Tag >> class

Kompiler alle Java-klasser i biblioteksstruktur med javac

1. Oversigt

Under nogle særlige omstændigheder har vi ikke et tredjepartsbyggeværktøj installeret, såsom Ant eller Maven. Og vi mangler stadig at kompilere et projekt med masser af pakker og klasser.

I denne øvelse skal vi bruge javac kommando for at udføre denne opgave med forskellige scenarier.

2. Brug af filnavne

Lad os antage, at vi har to mapper i den aktuelle mappe:src og ud . kilden mappen indeholder vores Java-kildefiler og out mappen vil indeholde de tilsvarende kompilerede klassefiler.

Lad os starte med et simpelt scenario. kilden biblioteket indeholder en enkelt Java-kildefil ved navn com/baeldung/MyClass.java :

Så lad os bruge javac for at kompilere MyClass.java fil i out mappe:

$ javac -d ./out/ ./src/com/baeldung/MyClass.java

I kommandoen ovenfor, -d option angiver destinationsmappen for klassefilen. Vi skal også bemærke, at den nøjagtige kode for MyClass.java fil er ikke så vigtig, og vi behøver kun at sikre, at det er en grammatik-korrekt Java-fil.

For at være lidt kompliceret, lad os tilføje yderligere tre Java-filer – YourClass.java , HerClass.java og HisClass.java :

For at kompilere alle fire af ovenstående Java-filer kan vi liste hver af dem på kommandolinjen:

$ javac -d ./out/ \
./src/com/baeldung/MyClass.java \
./src/com/baeldung/YourClass.java \
./src/com/baeldung/HerClass.java \
./src/com/baeldung/HisClass.java

Lad os derefter tilføje en ny Main.java fil, der refererer til de andre fire Java-filer, for eksempel ved at påkalde metoder eller oprette en objektforekomst:

I dette tilfælde behøver vi kun at kompilere Main.java fil:

$ javac -sourcepath ./src/ -d ./out/ ./src/com/baeldung/Main.java

Efter ovenstående kommando vil de andre fire klassefiler også blive kompileret. Det er fordi javac vil søge efter de nødvendige typer og kompilere de tilsvarende kildefiler som standard. Hvis vi ikke ønsker at kompilere de påkrævede typer, kan vi tilføje -implicit:none mulighed.

-kildestien option fortæller Java-kompileren, hvor inputkildefilerne skal findes. Hvis -kildestien indstillingen er ikke angivet, javac vil bruge brugerens klassesti til at søge efter både klassefilerne og kildefilerne. Så vi kan erstatte -kildestien mulighed med -klassestien eller -cp mulighed:

$ javac -cp ./src/ -d ./out/ ./src/com/baeldung/Main.java

Denne tilgang har dog sine begrænsninger:javac kommando kompilerer kun de nødvendige typer og udelader andre kildefiler . For eksempel, hvis vi tilføjer en ny ItsClass.java og Main.java ikke henviser til det, så ItsClass.java vil ikke blive kompileret:

For at opsummere er der to scenarier, der egner sig til at liste filnavne i javac kommandolinje:når der kun er nogle få Java-kildefiler, og når der er en launcher-klasse, der refererer til andre klasser rekursivt.

3. Brug af jokertegn

javac kommandoen understøtter også jokertegnet (*) til kompilering af flere kildefiler i samme mappe.

For eksempel kan vi bruge jokertegnet til at kompilere ovenstående kildefiler:

$ javac -d ./out/ ./src/com/baeldung/*.java

For at komplicere vores scenarie yderligere, lad os tilføje fire underpakker (forår , sommer , efterår og vinter ) og tilsvarende klasser:

Nu, på kommandolinjen, kan vi liste hver pakke med et jokertegn for at kompilere dem alle:

$ javac -d ./out/ \
./src/com/baeldung/*.java \
./src/com/baeldung/spring/*.java \
./src/com/baeldung/summer/*.java \
./src/com/baeldung/autumn/*.java \
./src/com/baeldung/winter/*.java

Når der kun er nogle få pakker, uanset kildefilnummeret, er det velegnet at bruge denne jokertegnsmetode.

4. Brug af argumentfiler

Når der er flere pakker at kompilere, så brug javac kommando med en argumentfil er praktisk. En argumentfil kan indeholde både javac valgmuligheder og kildefilnavne.

For at bruge en argumentfil skal vi foranstille at-tegnet (@ ) førende tegn før argumentet filnavn:

$ javac -d ./out/ @sources.txt

Men hvordan kan vi generere sådan en @sources.txt fil? Det afhænger af det OS, vi bruger. I Linux eller macOS kan vi bruge find kommando:

$ find ./src/ -type f -name "*.java" > sources.txt

I ovenstående kommandolinje, ./src/ er vores søgnings startpunktskatalog, -typen f option filtrerer kun almindelige filer og -navnet "*.java" indstilling matcher alle filnavne med .java udvidelse.

Men i Windows kan vi bruge dir kommando:

> dir src /b /s *.java > sources.txt

I ovenstående kommandolinje, src mappen er vores søgesti, /b switch viser mappen og filnavnene uden yderligere information, og /s option viser alle filer i en specificeret mappe og alle undermapper.

Manglen ved denne tilgang er, at hver gang vi tilføjer en ny eller fjerner en eksisterende Java-kildefil, skal vi genskabe sources.txt fil .

5. Andre tilgange

Udover de ovennævnte almindelige tilgange findes der også andre OS-afhængige tilgange, såsom brug af globstar eller rør.

5.1. Brug af Globstar

Bash version 4.0 tilføjer en ny globbing-indstilling kaldet globstar der behandler det dobbelte jokertegn (** ) anderledes. Med det aktiveret vil Bash krydse mapper på flere niveauer; Ellers vil Bash kun søge i et bibliotek på et enkelt niveau.

Denne mulighed er dog deaktiveret som standard. Og vi kan bruge shopt (sh + opt, shell-indstillinger) kommando for at inspicere Bash-indstillingsindstillingerne. Hvis vi udfører shopt kommando uden nogen argumenter, vil den udsende en lang liste af muligheder og deres statusser (on eller fra ).

I øjeblikket er vi kun bekymrede over globstaren mulighed:

$ shopt globstar
globstar       	off

For at aktivere det bruger vi shopt kommandoen med -s mulighed:

$ shopt -s globstar

For at deaktivere det, kalder vi shopt kommandoen med -u mulighed:

$ shopt -u globstar

Efter at have aktiveret denne mulighed, kan vi kalde javac med det dobbelte jokertegn :

$ javac -d ./out/ ./src/**/*.java

5.2. Brug af et rør

Konceptuelt er et rør en forbindelse mellem to processer. Og vi kan bruge denne rørmekanisme til at forbinde flere kommandoer for at producere vores ønskede resultater.

For at kompilere vores Java-kildefiler kan vi kombinere find , xargs og javac kommandoer:

$ find ./src/ -type f -name "*.java" | xargs javac -cp ./src/ -d ./out/

Også find kommandoen understøtter -exec handling:

$ find ./src/ -type f -name "*.java" -exec javac -cp ./src/ -d ./out/ '{}' ';'

Ovenstående kommandolinje kører muligvis lidt langsomt . Det er fordi javac kommando vil køre for hver matchede fil. For mere information kan vi bruge mand find kommando for at læse -exec optionens dokumentation.

For at være lidt hurtigere kan vi ændre semikolon (; ) til et plustegn (+ ) . Derefter, javac kommandoen samler alle de matchede filer og udfører kun én gang:

$ find ./src/ -type f -name "*.java" -exec javac -cp ./src/ -d ./out/ '{}' +

6. Konklusion

I denne artikel så vi først på nogle almindelige tilgange til at kompilere alle Java-kildefiler i en mappestruktur, såsom brug af filnavne, jokertegn og en argumentfil. Derefter så vi på nogle OS-afhængige tilgange, såsom at bruge globstar og rør.


Java tag