Memahami Fail Manifest JAR

1. Pengenalan

Sebuah Java Archive (JAR) dijelaskan oleh fail manifesnya. Artikel ini meneroka banyak kemampuannya, termasuk menambahkan atribusi, menjadikan JAR dapat dilaksanakan, dan memasukkan maklumat versi.

Mari mulakan, dengan tinjauan ringkas mengenai apa itu fail manifes.

2. Fail Manifest

Fail manifes bernama MANIFEST.MF dan terletak di bawah direktori META-INF di JAR. Ini hanyalah senarai pasangan kunci dan nilai, yang disebut tajuk atau atribut , yang dikelompokkan menjadi beberapa bahagian.

Tajuk ini menyediakan metadata yang membantu kami menerangkan aspek JAR kami seperti versi pakej, kelas aplikasi apa yang harus dilaksanakan, jalan kelas, bahan tandatangan dan banyak lagi.

3. Menambah Fail Manifest

3.1. Manifest Lalai

Fail manifes ditambahkan secara automatik setiap kali kita membuat JAR.

Contohnya, jika kita membina JAR di OpenJDK 11:

jar cf MyJar.jar classes/

Ia menghasilkan fail manifes yang sangat mudah:

Manifest-Version: 1.0 Created-By: 11.0.3 (AdoptOpenJDK)

3.2. Manifest Tersuai

Atau, kita boleh menentukan fail manifes kita sendiri.

Sebagai contoh, katakan bahawa kita mempunyai fail manifes khusus yang disebut manifest.txt :

Built-By: baeldung

Kita boleh memasukkan fail ini dan jar akan menggabungkannya dengan fail manifes lalai apabila kita menggunakan pilihan m :

jar cfm MyJar.jar manifest.txt classes/

Kemudian, fail manifes yang dihasilkan adalah:

Manifest-Version: 1.0 Built-By: baeldung Created-By: 11.0.3 (AdoptOpenJDK)

3.3. Maven

Sekarang, kandungan fail manifes lalai berubah bergantung pada alat yang kami gunakan.

Sebagai contoh, Maven menambah beberapa tajuk tambahan:

Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Created-By: Apache Maven 3.3.9 Built-By: baeldung Build-Jdk: 11.0.3

Kami sebenarnya boleh menyesuaikan tajuk ini di pom kami.

Katakan, sebagai contoh, bahawa kami ingin menunjukkan siapa JAR dibuat dan pakejnya:

 org.apache.maven.plugins maven-jar-plugin 3.1.2    com.baeldung.java   baeldung    

Ini menghasilkan fail manifes dengan pakej tersuai dan dibuat oleh tajuk:

Manifest-Version: 1.0 Build-Jdk-Spec: 11 Package: com.baeldung.java Created-By: baeldung 

Rujuk dokumentasi plugin Maven JAR untuk senarai lengkap pilihan.

4. Tajuk

Header mesti mengikuti format tertentu dan dipisahkan dengan baris baru:

key1: value1 Key2: value2

Tajuk yang sah mesti mempunyai ruang antara titik dua dan nilainya . Perkara penting lain ialah mesti ada baris baru di akhir fail . Jika tidak, tajuk terakhir tidak diambil kira.

Mari kita lihat beberapa tajuk standard dari spesifikasi dan beberapa tajuk khas yang biasa.

4.1. Tajuk Utama

Tajuk utama biasanya memberikan maklumat umum:

  • Manifest-Version : versi spesifikasi
  • Created-By : versi alat dan vendor yang membuat fail manifes
  • Pelbagai Pelepasan : jika benar , maka ini adalah Jar Pelbagai Pelepasan
  • Built-By : tajuk khas ini memberikan nama pengguna yang membuat fail manifes

4.2. Titik Masuk dan Pathpath

Sekiranya JAR kami mengandungi aplikasi yang dapat dijalankan, maka kami dapat menentukan titik masuk. Begitu juga, kami dapat menyediakan classpath . Dengan berbuat demikian, kita tidak perlu menentukannya semasa kita mahu menjalankannya.

  • Kelas Utama : pakej dan nama kelas dengan kaedah utama (tiada pelanjutan kelas.)
  • Kelas-Laluan : senarai ruang relatif yang dipisahkan ruang ke perpustakaan atau sumber

Sebagai contoh, jika titik masuk aplikasi kami berada di Application.class dan menggunakan perpustakaan dan sumber, maka kami dapat menambahkan tajuk yang diperlukan:

Main-Class: com.baeldung.Application Class-Path: core.jar lib/ properties/

Classpath merangkumi core.jar dan semua fail dalam direktori lib dan hartanah . Aset-aset ini dimuat berbanding dengan di mana JAR dilaksanakan dan bukan dari dalam JAR itu sendiri . Dengan kata lain, mereka mesti wujud di luar JAR.

4.3. Versi Pakej dan Pengedap

Tajuk standard ini menerangkan pakej dalam JAR.

  • Nama : bungkusan
  • Implementation-Build-Date: the build date for the implementation
  • Implementation-Title: the title of the implementation
  • Implementation-Vendor: the vendor for the implementation
  • Implementation-Version: the implementation version
  • Specification-Title: the title for the specification
  • Specification-Vendor: the vendor for the specification
  • Specification-Version: the specification version
  • Sealed: if true then all the classes for the package come from the same JAR (default is false)

For example, we find these manifest headers in the MySQL driver Connector/J JAR. They describe the version of the JDBC specification the JAR meets, as well as the version of the driver itself:

Specification-Title: JDBC Specification-Version: 4.2 Specification-Vendor: Oracle Corporation Implementation-Title: MySQL Connector/J Implementation-Version: 8.0.16 Implementation-Vendor: Oracle

4.4. Signed Jar

We can digitally sign our JAR to add extra security and verification. While this process is outside the scope of this article, doing so adds standard headers showing each signed class and its encoded signature to the manifest file. Please see the JAR signing documentation for more details.

4.5. OSGI

It's common to also see the custom headers for OSGI bundles:

  • Bundle-Name: title
  • Bundle-SymbolicName: a unique identifier
  • Bundle-Version: version
  • Import-Package: packages and versions the bundle depends on
  • Export-Package: bundle packages and versions available for use

See our Introduction to OSGI article to learn more about OSGI bundles.

5. Sections

There are two types of sections in a manifest file, main and per-entry. Headers that appear in the main section apply to everything in the JAR. Whereas headers that appear in the per-entry sections only apply to the named package or class.

In addition, a header appearing in a per-entry section overrides the same header in the main section. It is common for per-entry sections to contain information on package versions and sealing plus digital signing.

Let's look at a simple example of a per-entry section:

Implementation-Title: baeldung-examples Implementation-Version: 1.0.1 Implementation-Vendor: Baeldung Sealed: true Name: com/baeldung/utils/ Sealed: false

The main section at the top has sealed all packages within our JAR. However, the package com.baeldung.utils is unsealed by the per-entry section.

6. Conclusion

Artikel ini memberikan gambaran umum mengenai cara menambahkan fail manifes ke JAR, cara menggunakan bahagian dan beberapa tajuk biasa. Struktur fail manifes membolehkan kita memberikan maklumat standard, seperti maklumat versi.

Walau bagaimanapun, fleksibiliti ini membolehkan kita menentukan apa sahaja maklumat yang kita anggap relevan untuk menerangkan kandungan JAR kita.