Mengompilasi File Java * .class dengan javac

1. Ikhtisar

Tutorial ini akan memperkenalkan alat javac dan menjelaskan cara menggunakannya untuk mengompilasi file sumber Java ke dalam file kelas.

Kami akan memulai dengan deskripsi singkat tentang perintah javac , lalu memeriksa alat tersebut secara lebih mendalam dengan melihat berbagai opsinya.

2. Perintah javac

Kami dapat menentukan opsi dan file sumber saat menjalankan alat javac :

javac [options] [source-files]

Di mana [opsi] menunjukkan opsi yang mengontrol operasi alat, dan [file sumber] menunjukkan satu atau lebih file sumber yang akan dikompilasi.

Semua opsi memang sepenuhnya opsional. File sumber bisa langsung ditetapkan sebagai argumen ke perintah javac atau disimpan dalam file argumen yang direferensikan seperti yang dijelaskan nanti. Perhatikan bahwa file sumber harus diatur dalam hierarki direktori yang sesuai dengan nama yang sepenuhnya memenuhi syarat dari jenis yang dikandungnya .

Pilihan javac dikategorikan menjadi tiga kelompok: standar, kompilasi silang, dan ekstra. Pada artikel ini, kami akan fokus pada opsi standar dan tambahan.

Opsi kompilasi silang digunakan untuk kasus penggunaan yang kurang umum dari definisi tipe kompilasi terhadap implementasi JVM yang berbeda dari lingkungan kompiler dan tidak akan dibahas.

3. Jenis Definisi

Mari kita mulai dengan memperkenalkan kelas yang akan kita gunakan untuk mendemonstrasikan opsi javac :

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

Kode sumber ditempatkan di file com / baeldung / javac / Data.java .

Perhatikan bahwa kami menggunakan pemisah file * nix di artikel ini; pada mesin Windows, kita harus menggunakan garis miring terbalik (' \' ) daripada garis miring (' /' ).

4. Opsi Standar

Salah satu opsi standar yang paling umum digunakan dari perintah javac adalah -d , menentukan direktori tujuan untuk file kelas yang dibuat . Jika sebuah tipe bukan bagian dari paket default, struktur direktori yang mencerminkan nama paket dibuat untuk menyimpan file kelas dari tipe itu.

Mari jalankan perintah berikut di direktori yang berisi struktur yang disediakan di bagian sebelumnya:

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

The javac compiler akan menghasilkan file kelas javac-sasaran / com / baeldung / javac / Data.class . Perhatikan bahwa pada beberapa sistem, javac tidak secara otomatis membuat direktori target, yang dalam kasus ini adalah javac-target . Oleh karena itu, kami mungkin perlu melakukannya secara manual.

Berikut beberapa opsi lain yang sering digunakan:

  • -cp (atau -classpath , –class-path ) - menentukan di mana tipe yang diperlukan untuk mengompilasi file sumber kami dapat ditemukan. Jika opsi ini tidak ada danvariabel lingkungan CLASSPATH tidak disetel, direktori kerja saat ini akan digunakan (seperti yang terjadi pada contoh di atas).
  • -p (atau –module-path ) - menunjukkan lokasi modul aplikasi yang diperlukan. Opsi ini hanya berlaku untuk Java 9 ke atas - lihat tutorial ini untuk panduan sistem modul Java 9.

Jika kita ingin mengetahui apa yang terjadi selama proses kompilasi, misalnya kelas mana yang dimuat dan mana yang dikompilasi, kita dapat menerapkan opsi -verbose .

Opsi standar terakhir yang akan kita bahas adalah file argumen. Alih-alih meneruskan argumen langsung ke alat javac , kita bisa menyimpannya dalam file argumen . Nama file tersebut, diawali dengan karakter '@ ' , kemudian digunakan sebagai argumen perintah.

Ketika perintah javac menemukan argumen yang dimulai dengan '@ ' , itu menafsirkan karakter berikut sebagai jalur ke file dan memperluas konten file ke dalam daftar argumen. Spasi dan karakter baris baru dapat digunakan untuk memisahkan argumen yang disertakan dalam file argumen tersebut.

Mari kita asumsikan kita memiliki dua file, bernama options , dan types , di direktori javac-args dengan konten berikut:

File opsi :

-d javac-target -verbose

The jenis file:

com/baeldung/javac/Data.java

Kita dapat mengkompilasi tipe Data seperti sebelumnya dengan pesan detail yang dicetak di konsol dengan menjalankan perintah ini:

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

Daripada menyimpan argumen dalam file terpisah, kami juga dapat menyimpan semuanya dalam satu file .

Misalkan ada file bernama argumen di direktori javac-args :

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

Mari beri makan file ini ke javac untuk mendapatkan hasil yang sama seperti dengan dua file terpisah sebelumnya :

javac @javac-args/arguments

Perhatikan bahwa opsi yang telah kita bahas di bagian ini adalah yang paling umum saja. Untuk daftar lengkap opsi javac standar , lihat referensi ini.

5. Opsi Ekstra

Opsi tambahan javac adalah opsi non-standar, yang khusus untuk implementasi compiler saat ini dan dapat diubah di masa mendatang. Karena itu, kami tidak akan membahas opsi ini secara detail.

Namun, ada opsi yang sangat berguna dan patut disebutkan, -Xlint . Untuk penjelasan lengkap tentang opsi tambahan javac lainnya, ikuti tautan ini.

The -Xlint pilihan memungkinkan kita untuk mengaktifkan peringatan selama kompilasi . Ada dua cara untuk menentukan opsi ini di baris perintah:

  • -Xlint - memicu semua peringatan yang direkomendasikan
  • -Xlint: key [, key] * - mengaktifkan peringatan tertentu

Berikut adalah beberapa kunci -Xlint yang paling berguna :

  • rawtypes - memperingatkan tentang penggunaan jenis mentah
  • tidak dicentang - memperingatkan tentang operasi yang tidak dicentang
  • static - memperingatkan tentang akses ke anggota statis dari anggota instance
  • cast - memperingatkan tentang cast yang tidak perlu
  • serial - memperingatkan tentang kelas yang dapat diserialkan yang tidak memiliki serialversionUID
  • fallthrough - memperingatkan tentang kegagalan dalampernyataan switch

Sekarang, buat file bernama xlint-ops di direktori javac-args dengan konten berikut:

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

Saat menjalankan perintah ini:

javac @javac-args/xlint-ops

kita harus melihat rawtypes dan peringatan 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. Kesimpulan

Tutorial ini menjelaskan tentang alat javac , menunjukkan cara menggunakan opsi untuk mengelola proses kompilasi biasa.

Pada kenyataannya, kami biasanya mengompilasi program menggunakan IDE atau alat build daripada langsung mengandalkan javac . Namun, pemahaman yang kuat tentang alat ini akan memungkinkan kami menyesuaikan kompilasi dalam kasus penggunaan lanjutan.

Seperti biasa, kode sumber untuk tutorial ini dapat ditemukan di GitHub.