Menyusun Java * .class Files dengan javac

1. Gambaran keseluruhan

Tutorial ini akan memperkenalkan alat javac dan menerangkan cara menggunakannya untuk menyusun fail sumber Java ke dalam fail kelas.

Kami akan memulakan dengan penerangan ringkas mengenai perintah javac , kemudian memeriksa alat tersebut dengan lebih mendalam dengan melihat pelbagai pilihannya.

2. Perintah javac

Kita dapat menentukan pilihan dan fail sumber semasa menjalankan alat javac :

javac [options] [source-files]

Di mana [pilihan] menunjukkan pilihan yang mengawal operasi alat, dan [sumber-fail] menunjukkan satu atau lebih fail sumber yang akan disusun.

Semua pilihan sememangnya pilihan sepenuhnya. Fail sumber dapat ditentukan secara langsung sebagai argumen kepada perintah javac atau disimpan dalam fail argumen yang dirujuk seperti yang dijelaskan kemudian. Perhatikan bahawa fail sumber harus disusun dalam hierarki direktori yang sesuai dengan nama jenis yang terkandung sepenuhnya .

Pilihan javac dikategorikan kepada tiga kumpulan: standard, cross-compilation, dan extra. Dalam artikel ini, kami akan memberi tumpuan kepada pilihan standard dan tambahan.

Pilihan kompilasi silang digunakan untuk kes penggunaan yang kurang biasa untuk menyusun definisi jenis terhadap pelaksanaan JVM yang berbeza dari persekitaran penyusun dan tidak akan ditangani.

3. Jenis Definisi

Mari kita mulakan dengan memperkenalkan kelas yang akan kita gunakan untuk menunjukkan pilihan javac :

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

Kod sumber diletakkan di dalam fail com / baeldung / javac / Data.java .

Perhatikan bahawa kami menggunakan pemisah fail * nix dalam artikel ini; pada mesin Windows, kita mesti menggunakan garis miring terbalik (' \' ) dan bukan garis miring ke depan (' /' ).

4. Pilihan Standard

Salah satu pilihan standard yang paling sering digunakan dari perintah javac adalah -d , menentukan direktori tujuan untuk fail kelas yang dihasilkan . Sekiranya jenis bukan sebahagian daripada pakej lalai, struktur direktori yang menggambarkan nama pakej dibuat untuk menyimpan fail kelas jenis itu.

Mari kita laksanakan perintah berikut dalam direktori yang mengandungi struktur yang disediakan di bahagian sebelumnya:

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

The javac pengkompil akan menjana fail kelas javac-target / com / baeldung / javac / Data.class . Perhatikan bahawa pada beberapa sistem, javac tidak membuat direktori sasaran secara automatik, yang merupakan sasaran javac dalam hal ini. Oleh itu, kita mungkin perlu melakukannya secara manual.

Berikut adalah beberapa pilihan lain yang sering digunakan:

  • -cp (atau -classpath , bertaraf-jalan ) - menentukan di mana jenis yang diperlukan untuk menyusun fail sumber kami boleh didapati. Sekiranya pilihan ini hilang danpemboleh ubah persekitaran CLASSPATH tidak ditetapkan, direktori kerja semasa digunakan sebagai gantinya (seperti yang berlaku dalam contoh di atas).
  • -p (atau –module-path ) - menunjukkan lokasi modul aplikasi yang diperlukan. Pilihan ini hanya berlaku untuk Java 9 dan ke atas - rujuk tutorial ini untuk panduan sistem modul Java 9.

Sekiranya kita ingin mengetahui apa yang sedang berlaku semasa proses penyusunan, misalnya kelas mana yang dimuat dan yang disusun, kita dapat menerapkan pilihan -verbose .

Pilihan standard terakhir yang akan kita bahas ialah fail argumen. Daripada menyampaikan argumen terus ke alat javac , kita boleh menyimpannya dalam fail argumen . Nama-nama fail tersebut, diawali dengan watak ' @ ' , kemudian digunakan sebagai argumen perintah.

Apabila perintah javac menemui argumen yang dimulai dengan '@ ' , ia menafsirkan watak-watak berikut sebagai jalan menuju fail dan memperluas kandungan fail ke dalam senarai argumen. Spasi dan watak barisan baru dapat digunakan untuk memisahkan argumen yang termasuk dalam fail argumen tersebut.

Anggaplah kita mempunyai dua fail, bernama pilihan , dan jenis , dalam direktori javac-args dengan kandungan berikut:

The pilihan fail:

-d javac-target -verbose

Yang jenis fail:

com/baeldung/javac/Data.java

Kita boleh menyusun jenis Data seperti sebelumnya dengan mesej terperinci yang dicetak di konsol dengan melaksanakan perintah ini:

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

Daripada menyimpan argumen dalam fail yang berasingan, kami juga dapat menyimpan semuanya dalam satu fail .

Katakan ada fail bernama argumen dalam direktori javac-args :

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

Mari beri fail ini ke javac untuk mencapai hasil yang sama seperti dua fail berasingan sebelum :

javac @javac-args/arguments

Perhatikan pilihan yang telah kita lalui di bahagian ini adalah pilihan yang paling biasa sahaja. Untuk senarai lengkap pilihan javac standard , lihat rujukan ini.

5. Pilihan Tambahan

Pilihan tambahan javac adalah pilihan bukan standard, yang khusus untuk pelaksanaan penyusun semasa dan mungkin akan diubah pada masa akan datang. Oleh itu, kami tidak akan membahas pilihan ini secara terperinci.

Walau bagaimanapun, ada pilihan yang sangat berguna dan perlu disebutkan, -Xlint . Untuk penerangan lengkap mengenai pilihan tambahan javac yang lain , ikuti pautan ini.

Pilihan -Xlint membolehkan kami mengaktifkan amaran semasa penyusunan . Terdapat dua cara untuk menentukan pilihan ini pada baris perintah:

  • -Xlint - mencetuskan semua amaran yang disyorkan
  • -Xlint: key [, key] * - membolehkan amaran tertentu

Berikut adalah beberapa kunci -Xlint paling berguna:

  • jenis mentah - memberi amaran mengenai penggunaan jenis mentah
  • tidak dicentang - memberi amaran mengenai operasi yang tidak diperiksa
  • statik - memberi amaran mengenai akses ke anggota statik dari ahli instance
  • pemeran - memberi amaran mengenai pelakon yang tidak perlu
  • bersiri - memberi amaran mengenai kelas bersiri yang tidak mempunyai UU serialversion
  • fallthrough - memberi amaran mengenai kejatuhan dalampernyataan pertukaran

Sekarang, buat fail bernama xlint-ops di direktori javac-args dengan kandungan berikut:

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

Semasa menjalankan arahan ini:

javac @javac-args/xlint-ops

kita harus melihat jenis mentah dan amaran yang tidak dicentang :

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. Kesimpulannya

Tutorial ini melalui alat javac , menunjukkan cara menggunakan pilihan untuk menguruskan proses penyusunan khas.

Pada hakikatnya, kita biasanya menyusun program menggunakan IDE atau alat binaan daripada terus bergantung pada javac . Walau bagaimanapun, pemahaman yang kukuh mengenai alat ini akan membolehkan kita menyesuaikan penyusunan dalam kes penggunaan lanjutan.

Seperti biasa, kod sumber untuk tutorial ini boleh didapati di GitHub.