Inzicht in het JAR-manifestbestand

1. Inleiding

Een Java-archief (JAR) wordt beschreven door het manifestbestand. In dit artikel worden de vele mogelijkheden onderzocht, waaronder het toevoegen van attributie, het uitvoerbaar maken van de JAR en het insluiten van versie-informatie.

Laten we echter beginnen met een korte bespreking van wat een manifestbestand is.

2. Het manifestbestand

Het manifestbestand heeft de naam MANIFEST.MF en bevindt zich onder de META-INF directory in de JAR. Het is gewoon een lijst met sleutel- en waardeparen, genaamd headers of attributen, gegroepeerd in secties.

Deze headers metadata leveren die ons helpen aspecten van onze JAR te beschrijven, zoals de versies van pakketten, welke toepassingsklasse uit te voeren, het klassenpad, handtekeningmateriaal en nog veel meer.

3. Een manifestbestand toevoegen

3.1. Het standaardmanifest

Er wordt automatisch een manifestbestand toegevoegd wanneer we een JAR maken.

Als we bijvoorbeeld een JAR bouwen in OpenJDK 11:

jar cf MyJar.jar klassen /

Het produceert een heel eenvoudig manifestbestand:

Manifest-versie: 1.0 Gemaakt door: 11.0.3 (AdoptOpenJDK)

3.2. Een aangepast manifest

Of we kunnen ons eigen manifestbestand specificeren.

Laten we bijvoorbeeld zeggen dat we een aangepast manifestbestand hebben met de naam manifest.txt:

Gebouwd door: baeldung

We kunnen dit bestand en pot zullen voeg het samen met het standaard manifestbestand wanneer we de m keuze:

jar cfm MyJar.jar manifest.txt klassen /

Het resulterende manifestbestand is dan:

Manifest-versie: 1.0 Gebouwd door: baeldung Gemaakt door: 11.0.3 (AdoptOpenJDK)

3.3. Maven

Nu, de inhoud van het standaard manifestbestand veranderen afhankelijk van welke tools we gebruiken.

Maven voegt bijvoorbeeld wat extra headers toe:

Manifest-versie: 1.0 Archiver-versie: Plexus Archiver Gemaakt door: Apache Maven 3.3.9 Gebouwd door: baeldung Build-Jdk: 11.0.3

We kunnen deze headers eigenlijk aanpassen in onze pom.

Stel bijvoorbeeld dat we willen aangeven door wie de JAR is gemaakt en het pakket:

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

Dit levert een manifestbestand op met een aangepast pakket en gemaakt door headers:

Manifest-versie: 1.0 Build-Jdk-Spec: 11 Pakket: com.baeldung.java Gemaakt door: baeldung 

Raadpleeg de documentatie van de Maven JAR-plug-in voor een volledige lijst van de opties.

4. Kopteksten

Een koptekst moet een bepaald formaat volgen en worden gescheiden door een nieuwe regel:

key1: value1 Key2: value2

Een geldige koptekst moet een spatie hebben tussen de dubbele punt en de waarde. Een ander belangrijk punt is er moet een nieuwe regel aan het einde van het bestand zijn. Anders wordt de laatste koptekst genegeerd.

Laten we eens kijken naar enkele standaardkopteksten uit de specificatie en enkele veelvoorkomende aangepaste kopteksten.

4.1. Hoofdkoppen

Hoofdkoppen bevatten doorgaans algemene informatie:

  • Manifest-versie: de versie van de specificatie
  • Gemaakt door: de toolversie en leverancier die het manifestbestand heeft gemaakt
  • Meerdere releases: als waar, dan is dit een Multi-Release Jar
  • Gebouwd door: deze aangepaste header geeft de naam van de gebruiker die het manifestbestand heeft gemaakt

4.2. Toegangspunt en klassenpad

Als onze JAR een uitvoerbare applicatie bevat, kunnen we het toegangspunt specificeren. Evenzo kunnen we de klassenpad. Door dit te doen, vermijden we dat we het moeten specificeren wanneer we het willen uitvoeren.

  • Hoofdklasse: het pakket en de naam van de klasse met een hoofdmethode (geen .class-extensie)
  • Klasse-pad: een door spaties gescheiden lijst met relatieve paden naar bibliotheken of bronnen

Als het toegangspunt van onze applicatie zich bijvoorbeeld in Application.class en het gebruikt bibliotheken en bronnen, dan kunnen we de benodigde headers toevoegen:

Hoofdklasse: com.baeldung.Application Klasse-pad: core.jar lib / properties /

Het klassenpad bevat core.jar en alle bestanden in het lib en eigendommen mappen. Deze items worden geladen ten opzichte van waar de JAR wordt uitgevoerd en niet vanuit de JAR zelf. Met andere woorden, ze moeten buiten de JAR bestaan.

4.3. Verpakkingsversie en verzegeling

Deze standaard headers beschrijven de pakketten binnen de JAR.

  • Naam: het pakket
  • Implementatie-build-datum: de builddatum voor de implementatie
  • Implementatie-titel: de titel van de implementatie
  • Implementatie-leverancier: de leverancier voor de implementatie
  • Implementatie-versie: de implementatieversie
  • Specificatie-titel: de titel van de specificatie
  • Specificatie-leverancier: de verkoper van de specificatie
  • Specificatie-versie: de specificatieversie
  • Verzegeld: indien waar dan komen alle klassen voor het pakket uit dezelfde JAR (standaard is false)

We vinden deze manifest-headers bijvoorbeeld in de MySQL-driver Connector / J JAR. Ze beschrijven de versie van de JDBC-specificatie waaraan de JAR voldoet, evenals de versie van de driver zelf:

Specificatie-Titel: JDBC Specificatie-Versie: 4.2 Specificatie-Leverancier: Oracle Corporation Implementatie-Titel: MySQL Connector / J Implementatie-Versie: 8.0.16 Implementatie-Leverancier: Oracle

4.4. Ondertekende pot

We kunnen onze JAR digitaal ondertekenen om extra beveiliging en verificatie toe te voegen. Hoewel dit proces buiten het bestek van dit artikel valt, Hierdoor worden standaard headers toegevoegd die elke ondertekende klasse en zijn gecodeerde handtekening tonen aan het manifestbestand. Raadpleeg de JAR-ondertekeningsdocumentatie voor meer details.

4.5. OSGI

Het is gebruikelijk om ook de aangepaste headers voor OSGI-bundels te zien:

  • Bundelnaam: titel
  • Bundel-SymbolicName: een unieke identificatie
  • Bundelversie: versie
  • Import-pakket: pakketten en versies waarvan de bundel afhankelijk is
  • Export-pakket: bundelpakketten en beschikbare versies voor gebruik

Zie ons artikel Inleiding tot OSGI voor meer informatie over OSGI-bundels.

5. Secties

Er zijn twee soorten secties in een manifestbestand, hoofd- en per-item. Kopteksten die in de hoofdsectie verschijnen, zijn van toepassing op alles in de JAR. Terwijl kopteksten die in de secties per invoer verschijnen, zijn alleen van toepassing op het genoemde pakket of de genoemde klasse.

Bovendien overschrijft een koptekst die in een sectie per invoer verschijnt, dezelfde koptekst in de hoofdsectie. Het is gebruikelijk dat secties per invoer informatie bevatten over pakketversies en verzegeling plus digitale ondertekening.

Laten we eens kijken naar een eenvoudig voorbeeld van een sectie per invoer:

Implementatie-titel: baeldung-voorbeelden Implementatie-versie: 1.0.1 Implementatie-leverancier: Baeldung Sealed: true Naam: com / baeldung / utils / Sealed: false

Het hoofdgedeelte bovenaan heeft alle pakketten in onze JAR verzegeld. Het pakket com.baeldung.utils is ontzegeld door de per-entry sectie.

6. Conclusie

Dit artikel geeft een overzicht van hoe u een manifestbestand aan een JAR toevoegt, hoe u secties en enkele veelvoorkomende headers gebruikt. Door de structuur van het manifestbestand kunnen we standaardinformatie verstrekken, zoals versie-informatie.

De flexibiliteit stelt ons echter in staat om alle informatie te definiëren die we relevant vinden om de inhoud van onze JAR's te beschrijven.