Ich habe viel zu viel Zeit damit verbracht, dies herauszufinden. Dies sollte die einfachste Sache sein und jeder, der Java-Anwendungen in Gläsern verteilt, muss damit umgehen.Wie erstellen Sie eine MANIFEST.MF, die verfügbar ist, wenn Sie ein in der Produktion befindliches JAR testen und ausführen?
Ich möchte nur wissen, wie ich meiner Java-App Versionierung hinzufügen kann, damit ich beim Testen auf die Versionsinformationen zugreifen kann, z. Debugging in Eclipse und läuft aus einem Glas.
Hier ist, was ich in meinem build.xml haben:
<target name="jar" depends = "compile">
<property name="version.num" value="1.0.0"/>
<buildnumber file="build.num"/>
<tstamp>
<format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" />
</tstamp>
<manifest file="${build}/META-INF/MANIFEST.MF">
<attribute name="Built-By" value="${user.name}" />
<attribute name="Built-Date" value="${TODAY}" />
<attribute name="Implementation-Title" value="MyApp" />
<attribute name="Implementation-Vendor" value="MyCompany" />
<attribute name="Implementation-Version" value="${version.num}-b${build.number}"/>
</manifest>
<jar destfile="${build}/myapp.jar" basedir="${build}" excludes="*.jar" />
</target>
Diese /META-INF/MANIFEST.MF schafft und ich kann die Werte lesen, wenn ich in Eclipse bin Debuggen thusly:
public MyClass()
{
try
{
InputStream stream = getClass().getResourceAsStream("/META-INF/MANIFEST.MF");
Manifest manifest = new Manifest(stream);
Attributes attributes = manifest.getMainAttributes();
String implementationTitle = attributes.getValue("Implementation-Title");
String implementationVersion = attributes.getValue("Implementation-Version");
String builtDate = attributes.getValue("Built-Date");
String builtBy = attributes.getValue("Built-By");
}
catch (IOException e)
{
logger.error("Couldn't read manifest.");
}
}
Aber, wenn ich die jAR-Datei erstellen, lädt er das Manifest eines anderen Glas (vermutlich das erste Glas durch die Anwendung geladen - in meinem Fall activation.jar).
Auch der folgende Code funktioniert nicht entweder, obwohl alle die richtigen Werte sind in der Manifest-Datei.
Package thisPackage = getClass().getPackage();
String implementationVersion = thisPackage.getImplementationVersion();
Irgendwelche Ideen?
In einer realen Anwendung, die alle Bibliotheken von Drittanbietern verwendet, ist dies sehr wahrscheinlich die falschen zurückzukehren Manifest. –
Klassenname sollte in Großbuchstaben beginnen. Es sollte PackageVersion anstelle von packageVersion sein. – Carlos