Compilazione di file Java * .class con javac

1. Panoramica

Questo tutorial introdurrà lo strumento javac e descrive come usarlo per compilare i file sorgente Java in file di classe.

Inizieremo con una breve descrizione del comando javac , quindi esamineremo lo strumento in modo più approfondito osservando le sue varie opzioni.

2. Il comando javac

Possiamo specificare opzioni e file sorgente durante l'esecuzione dello strumento javac :

javac [options] [source-files]

Dove [opzioni] denota le opzioni che controllano le operazioni dello strumento e [file-sorgente] indica uno o più file sorgente da compilare.

Tutte le opzioni sono infatti del tutto opzionali. I file sorgente possono essere specificati direttamente come argomenti del comando javac o conservati in un file di argomenti referenziato come descritto più avanti. Si noti che i file di origine devono essere disposti in una gerarchia di directory corrispondente ai nomi completi dei tipi che contengono .

Le opzioni di javac sono classificate in tre gruppi: standard, compilazione incrociata ed extra. In questo articolo, ci concentreremo sulle opzioni standard ed extra.

Le opzioni di compilazione incrociata vengono utilizzate per il caso d'uso meno comune della compilazione di definizioni di tipo rispetto a un'implementazione JVM diversa dall'ambiente del compilatore e non verranno affrontate.

3. Definizione del tipo

Iniziamo introducendo la classe che useremo per dimostrare le opzioni di javac :

public class Data { List textList = new ArrayList(); public void addText(String text) { textList.add(text); } public List getTextList() { return this.textList; } }

Il codice sorgente si trova nel file com / baeldung / javac / Data.java .

Nota che in questo articolo usiamo separatori di file * nix; su macchine Windows, dobbiamo usare la barra rovesciata (' \' ) invece della barra (' /' ).

4. Opzioni standard

Una delle opzioni standard più comunemente utilizzate del comando javac è -d , che specifica la directory di destinazione per i file di classe generati . Se un tipo non fa parte del pacchetto predefinito, viene creata una struttura di directory che riflette il nome del pacchetto per mantenere il file di classe di quel tipo.

Eseguiamo il seguente comando nella directory contenente la struttura fornita nella sezione precedente:

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

Il compilatore javac genererà il file di classe javac-target / com / baeldung / javac / Data.class . Nota che su alcuni sistemi, javac non crea automaticamente la directory di destinazione, che in questo caso è javac-target . Pertanto, potrebbe essere necessario farlo manualmente.

Ecco un paio di altre opzioni utilizzate di frequente:

  • -cp (o -classpath , –class -path ) - specifica dove possono essere trovati i tipi richiesti per compilare i nostri file sorgente. Se questa opzione non è presente e la variabile d' ambiente CLASSPATH non è impostata, viene invece utilizzata la directory di lavoro corrente (come nell'esempio precedente).
  • -p (o –module-path ) - indica la posizione dei moduli dell'applicazione necessari. Questa opzione è applicabile solo a Java 9 e versioni successive: fare riferimento a questo tutorial per una guida al sistema di moduli Java 9.

Se vogliamo sapere cosa sta succedendo durante un processo di compilazione, ad esempio quali classi vengono caricate e quali compilate, possiamo applicare l' opzione -verbose .

L'ultima opzione standard che tratteremo è il file degli argomenti. Invece di passare argomenti direttamente allo strumento javac , possiamo memorizzarli in file di argomenti . I nomi di questi file, preceduti dal carattere "@ " , vengono quindi utilizzati come argomenti del comando.

Quando il comando javac incontra un argomento che inizia con "@ " , interpreta i seguenti caratteri come il percorso di un file ed espande il contenuto del file in un elenco di argomenti. È possibile utilizzare spazi e caratteri di nuova riga per separare gli argomenti inclusi in un file di argomenti di questo tipo.

Supponiamo di avere due file, opzioni denominate e tipi , nella directory javac-args con il seguente contenuto:

Il file delle opzioni :

-d javac-target -verbose

Il file dei tipi :

com/baeldung/javac/Data.java

Possiamo compilare il tipo di dati come prima con messaggi di dettaglio stampati sulla console eseguendo questo comando:

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

Invece di mantenere gli argomenti in file separati, possiamo anche archiviarli tutti in un unico file .

Supponiamo che ci sia un file denominato argomenti nella directory javac-args :

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

Forniamo questo file a javac per ottenere lo stesso risultato dei due file separati prima :

javac @javac-args/arguments

Notare che le opzioni che abbiamo esaminato in questa sezione sono solo le più comuni. Per un elenco completo delle opzioni javac standard , controlla questo riferimento.

5. Opzioni extra

Le opzioni extra di javac sono opzioni non standard, che sono specifiche dell'attuale implementazione del compilatore e potrebbero essere modificate in futuro. Pertanto, non esamineremo queste opzioni in dettaglio.

Tuttavia, esiste un'opzione molto utile e degna di nota, -Xlint . Per una descrizione completa delle altre opzioni extra di javac , segui questo link.

L' opzione -Xlint ci permette di abilitare gli avvisi durante la compilazione . Esistono due modi per specificare questa opzione sulla riga di comando:

  • -Xlint: attiva tutti gli avvisi consigliati
  • -Xlint: key [, key] * - abilita avvisi specifici

Ecco alcuni dei tasti -Xlint più comodi :

  • rawtypes – warns about the use of raw types
  • unchecked – warns about unchecked operations
  • static – warns about the access to a static member from an instance member
  • cast – warns about unnecessary casts
  • serial – warns about serializable classes not having a serialversionUID
  • fallthrough – warns about the falling through in a switch statement

Now, create a file named xlint-ops in the javac-args directory with the following content:

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

When running this command:

javac @javac-args/xlint-ops

we should see the rawtypes and unchecked warnings:

com/baeldung/javac/Data.java:7: warning: [rawtypes] found raw type: ArrayList List textList = new ArrayList(); ^ missing type arguments for generic class ArrayList where E is a type-variable: E extends Object declared in class ArrayList com/baeldung/javac/Data.java:7: warning: [unchecked] unchecked conversion List textList = new ArrayList(); ^ required: List found: ArrayList ...

6. Conclusion

Questo tutorial ha illustrato lo strumento javac , mostrando come utilizzare le opzioni per gestire il tipico processo di compilazione.

In realtà, di solito compiliamo un programma utilizzando un IDE o uno strumento di compilazione piuttosto che affidarci direttamente a javac . Tuttavia, una solida conoscenza di questo strumento ci consentirà di personalizzare la compilazione in casi d'uso avanzati.

Come sempre, il codice sorgente di questo tutorial può essere trovato su GitHub.