JAR (file format)

JAR (Java ARchive) adalah format berkas yang digunakan untuk mengumpulkan banyak berkas kelas Java dan metadata terkait serta sumber-sumber lainnya (teks, gambar, dsb) ke dalam satu berkas untuk didistribusikan.

Berkas JAR merupakan berkas arsip yang berisi berkas-berkas manifes khusus Java. Berkas JAR dibuat berbasis format berkas ZIP dan biasanya mempunyai ekstensi berkas .jar

Desain
File JAR memungkinkan runtime Java untuk menerapkan seluruh aplikasi secara efisien, termasuk kelasnya dan sumber daya yang terkait, dalam satu permintaan. Elemen file JAR dapat dikompresi, mempersingkat waktu pengunduhan.

File JAR mungkin berisi file manifes, yang terletak di META-INF/MANIFEST.MF. Entri dalam file manifes menjelaskan cara menggunakan file JAR. Misalnya, entri Classpath dapat digunakan untuk menentukan file JAR lain yang akan dimuat dengan JAR.

Ekstraksi
Isi file dapat diekstraksi menggunakan perangkat lunak ekstraksi arsip apa pun yang mendukung format ZIP, atau utilitas baris perintah jar yang disediakan oleh Java Development Kit.

Keamanan
Pengembang dapat menandatangani file JAR secara digital. Dalam hal itu, informasi tanda tangan menjadi bagian dari file manifes yang disematkan. JAR itu sendiri tidak ditandatangani, melainkan setiap file di dalam arsip dicantumkan bersama dengan checksumnya; checksum inilah yang ditandatangani. Beberapa entitas dapat menandatangani file JAR, mengubah file JAR itu sendiri dengan setiap penandatanganan, meskipun file yang ditandatangani tetap valid. Saat runtime Java memuat file JAR yang ditandatangani, itu dapat memvalidasi tanda tangan dan menolak memuat kelas yang tidak cocok dengan tanda tangan. Itu juga dapat mendukung paket ‘disegel’, di mana Classloader hanya akan mengizinkan kelas Java untuk dimuat ke dalam paket yang sama jika semuanya ditandatangani oleh entitas yang sama. Ini mencegah kode berbahaya dimasukkan ke dalam paket yang ada, sehingga mendapatkan akses ke kelas dan data yang dicakup paket.

Konten file JAR mungkin disamarkan untuk mempersulit rekayasa balik.

File JAR yang dapat dieksekusi
Program Java yang dapat dieksekusi dapat dikemas dalam file JAR, bersama dengan pustaka apa pun yang digunakan program. File JAR yang dapat dieksekusi memiliki manifes yang menentukan kelas titik masuk dengan Main-Class: myPrograms.MyClass dan Class-Path yang eksplisit (dan argumen -cp diabaikan). Beberapa sistem operasi dapat menjalankan ini secara langsung saat diklik. Doa tipikal adalah java -jar foo.jar dari baris perintah.

Peluncur asli dapat dibuat di sebagian besar platform. Misalnya, pengguna Microsoft Windows yang lebih suka memiliki file Windows EXE dapat menggunakan alat seperti JSmooth, Launch4J, WinRun4J atau Nullsoft Scriptable Install System untuk membungkus satu file JAR menjadi executable.

Tampak
File manifes adalah file metadata yang terdapat dalam JAR.[5][6] Ini mendefinisikan ekstensi dan data terkait paket. Ini berisi pasangan nama-nilai yang disusun dalam beberapa bagian. Jika file JAR dimaksudkan untuk digunakan sebagai file yang dapat dieksekusi, file manifes menentukan kelas utama aplikasi. File manifes bernama MANIFEST.MF. Direktori manifes harus menjadi entri pertama dari arsip terkompresi.

Spesifikasi
Manifes muncul di lokasi kanonis META-INF/MANIFEST.MF.[7] Hanya ada satu file manifes dalam arsip dan harus berada di lokasi tersebut.

Konten file manifes dalam file JAR yang dibuat dengan Java Development Kit versi 1.0 adalah sebagai berikut.

Nama dipisahkan dari nilainya dengan tanda titik dua. Manifes default menunjukkan bahwa itu sesuai dengan versi 1.0 dari spesifikasi manifes.

Manifes dapat berisi informasi tentang file lain yang dikemas dalam arsip. Konten manifes bergantung pada tujuan penggunaan file JAR. File manifes default tidak membuat asumsi tentang informasi apa yang harus direkam tentang file lain, sehingga satu barisnya hanya berisi data tentang dirinya sendiri. Itu harus dikodekan dalam UTF-8.

Header Manifes Tujuan Khusus
File JAR yang dibuat hanya untuk tujuan pengarsipan tidak menggunakan file MANIFEST.MF.

Sebagian besar penggunaan file JAR melampaui pengarsipan dan kompresi sederhana dan memerlukan informasi khusus dalam file manifes.

Fitur
Manifes memungkinkan pengembang untuk menentukan beberapa fitur berguna untuk guci mereka. Properti ditentukan dalam key-value pair.

Aplikasi
Jika aplikasi terdapat dalam file JAR, Java Virtual Machine perlu mengetahui titik masuk aplikasi tersebut. Titik masuk adalah kelas apa pun dengan metode public static void main(String[] args). Informasi ini disediakan dalam manifes Main-Class header, yang memiliki bentuk umum:

Kelas Utama: com.example.MyClassName
Dalam contoh ini com.example.MyClassName.main() dijalankan saat peluncuran aplikasi.

Penyegelan Paket
Secara opsional, sebuah paket dalam file JAR dapat disegel, yang berarti bahwa semua kelas yang ditentukan dalam paket tersebut diarsipkan dalam file JAR yang sama. Sebuah paket mungkin disegel untuk memastikan konsistensi versi di antara kelas-kelas dalam perangkat lunak atau sebagai ukuran keamanan.

Untuk menyegel sebuah paket, entri Nama harus muncul, diikuti dengan header Tersegel, seperti:

Nama: Perusahaanku/Paketku/
Disegel: benar

Nilai header Nama adalah nama jalur relatif paket. Perhatikan bahwa ini diakhiri dengan ‘/’ untuk membedakannya dari nama file. Header apa pun yang mengikuti header Nama, tanpa ada baris kosong yang mengintervensi, berlaku untuk file atau paket yang ditentukan di header Nama. Dalam contoh di atas, karena header Sealed muncul setelah header Name: myCompany/myPackage tanpa baris kosong yang mengintervensi, header Sealed berlaku (hanya) untuk paket myCompany/myPackage.

Fitur paket tersegel sudah ketinggalan zaman oleh Sistem Modul Platform Java yang diperkenalkan di Java 9, di mana modul tidak dapat membagi paket.[8]

Versi Paket
Beberapa header manifes menyimpan informasi pembuatan versi. Satu set header dapat ditugaskan ke setiap paket. Header versi muncul langsung di bawah header Nama untuk paket. Contoh ini menunjukkan semua header versi:

  • Nama: java/util/
    Spesifikasi-Judul: “Kelas Utilitas Java”
    Spesifikasi-Versi: “1.2”
    Spesifikasi-Vendor: “Sun Microsystems, Inc.”.
    Implementasi-Judul: “java.util”
    Implementasi-Versi: “build57”
    Vendor Implementasi: “Sun Microsystems, Inc.”

Multi-Rilis
Stoples dapat secara opsional ditandai sebagai stoples multi-pelepasan. Menggunakan fitur multi-rilis memungkinkan pengembang perpustakaan untuk memuat kode yang berbeda tergantung pada versi runtime Java.[9] Hal ini pada gilirannya memungkinkan pengembang untuk memanfaatkan fitur baru tanpa mengorbankan kompatibilitas.

Jar multi-rilis diaktifkan menggunakan deklarasi berikut dalam manifes:

Multi-Rilis: benar
Ketergantungan

File MANIFEST.MF dapat digunakan untuk menentukan semua kelas yang harus dimuat agar aplikasi dapat dijalankan.[10]

Perhatikan bahwa entri Class-Path dibatasi dengan spasi, bukan dengan pembatas jalur sistem:

Jalur Kelas: . pkg1.jar jalur/ke/pkg2.jar
Dukungan Apache Ant Zip/JAR
Alat build Apache Ant memiliki paketnya sendiri untuk membaca dan menulis arsip Zip dan JAR, termasuk dukungan untuk ekstensi sistem file Unix. Paket org.apache.tools.zip dirilis di bawah lisensi Apache Software Foundation dan dirancang agar dapat digunakan di luar Ant.

Format terkait
Beberapa format file terkait dibuat berdasarkan format JAR:

  • File WAR (arsip aplikasi Web), juga arsip Java, menyimpan file XML, kelas Java, Halaman JavaServer, dan objek lain untuk Aplikasi Web.
  • File RAR (arsip adaptor sumber daya) (jangan bingung dengan format file RAR), juga arsip Java, menyimpan file XML, kelas Java, dan objek lain untuk aplikasi J2EE Connector Architecture (JCA).
  • File EAR (arsip perusahaan) menyediakan arsip Java komposit yang menggabungkan file XML, kelas Java, dan objek lain termasuk file arsip Java JAR, WAR, dan RAR untuk Aplikasi Perusahaan.
  • SAR (arsip layanan) mirip dengan EAR. Ini menyediakan file service.xml dan file JAR yang menyertainya.
  • APK (paket aplikasi Android), varian dari format arsip Java, digunakan untuk aplikasi Android.[11]
  • AAR (Android archive) digunakan untuk distribusi library Android, biasanya melalui Maven.[12]
  • PAR (arsip paket) – didukung oleh server aplikasi Eclipse Virgo OSGi, memungkinkan penyebaran aplikasi OSGi multi-bundel sebagai arsip tunggal dan menyediakan isolasi dari aplikasi berbasis PAR lainnya yang digunakan di server yang sama.
  • KAR (Arsip Karaf) – didukung oleh server aplikasi Apache Karaf OSGi, memungkinkan penyebaran aplikasi OSGi multi-bundel dan multi-fitur.