# "Implementation-Version" aus Manifest auslesen



## dermoritz (14. Mai 2012)

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.


----------



## fastjack (15. Mai 2012)

Poste mal was in Deiner MANIFEST.MF steht.


----------



## kama (15. Mai 2012)

Hi,

siehe mal hier:

java - Reading my own Jar's Manifest - Stack Overflow

Gruß
Karl-Heinz Marbaise


----------



## dermoritz (15. Mai 2012)

derzeit sieht die manifest-Datei so aus:


```
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.


----------



## kama (15. Mai 2012)

Hi,



dermoritz hat gesagt.:


> 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


----------



## dermoritz (15. Mai 2012)

oder anders gesagt:
Das 

```
<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.


----------



## darekkay (16. Mai 2012)

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
> ...



Nun kann ich problemlos auf die Informationen zugreifen:

```
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.


----------

