"Implementation-Version" aus Manifest auslesen

dermoritz

Bekanntes Mitglied
Ich habe Maven dazu gebracht unter anderem die aktuelle Projektversion ins Mainfest zu schreiben - in meinem Fall ist es eine Web-App:

java - How to get Maven Artifact version at runtime? - Stack Overflow

nur funktioniert der dort beschriebene Weg die Version auszulesen nicht - getImplementationVersion() liefert null.
Was mich stutzig macht ist, dass getImplementationVersion() nicht statisch ist sondern relative zur Klasse/zum Paket aus dem es aufgerufen wird.

Wie lese ich also die Version aus bzw. wie Rufe ich getImplementationVersion() statisch/unabhängig von der Klasse auf?

Wobei ich das auch versucht habe: Package.getPackage("de.dies.das").getImplementationVersion(). "de.dies.das" hab ich mir von Maven auch in die Manifestdatei eintragen lassen - per <packageName/>. Aber damit gibt getPackage null zurück.
 
derzeit sieht die manifest-Datei so aus:

Code:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: STL1335
Build-Jdk: 1.6.0_31
Specification-Title: xxx
Specification-Version: 1.1.0-SNAPSHOT
Specification-Vendor: xxx
Implementation-Title: xxx
Implementation-Version: 1.1.0-SNAPSHOT
Implementation-Vendor-Id: xxx
Implementation-Vendor:xxx

Die Frage wäre ob ich an die Version per get...Version rankomme. Falls es nur so geht wie du schreibst kama (Datei einlesen), dann nützt es mir eigentlich nix. Ich lese ja eine Konfigurationsdatei ein, dort ein "Version=${project.version} hinzufügen wäre ein leichtes.
Ich dachte halt der Standardweg eine Version zu hinterlegen ist das Manifest und für das Auslesen gibt es die get...Version-Methoden. Aber wenn die Methoden unnütz sind muss ich auch das Manifest nicht benutzen.
 
Hi,

derzeit sieht die manifest-Datei so aus:
.....Falls es nur so geht wie du schreibst kama (Datei einlesen), dann nützt es mir eigentlich nix.
Das ist eine Resource, da diese ja innerhalb des JAR's liegt und nicht auf dem Dateisystem...

Unter META-INF/maven/${groupId}/${artifactId}/pom.properties
findest auch eine entsprechende Datei die das schon beinhaltet...Das Teil muss dann aber auch als Resource gelesen werden, da es ja im JAR bzw. WAR file verpackt ist...

Gruß
Karl-Heinz Marbaise
 
oder anders gesagt:
Das
Code:
<archive>
						<manifest>
							<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
							<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
							<packageName/>
						</manifest>
					</archive>
bringt eigentlich nichts - nur eine weitere Datei in der unter anderem die Version steht. In meinem Fall lese ich ja breits eine Resource - die Propertiesdatei. Nun steht da wie erwähnt version=${project.version} und die Sache ist erledigt.
 
So hier geht's bei mir:
[XML]<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>my.main.class.Main</mainClass>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
</plugin>[/XML]
Dies erzeugt die entsprechenden Informationen im Manifest:
(...)
Implementation-Title: xxx
Implementation-Version: xxx
Implementation-Vendor-Id: xxx
Built-By: xxx
Build-Jdk: 1.7.0
Specification-Title: xxx
Specification-Version: xxx
Main-Class: my.main.class.Main
(...)

Nun kann ich problemlos auf die Informationen zugreifen:
Java:
getClass().getPackage().getImplementationTitle()

Was du eventuell nicht beachtest: wenn du nun das Programm mit Eclipse startest, werden die Informationen natürlich nicht sichtbar. Nach einem Maven-Build-Vorgang kann ich aber in der erstellten jar-Datei die gewünschten Infos sehen.
 

Neue Themen


Zurück
Oben