Spędziłem zbyt dużo czasu, próbując to rozgryźć. To powinno być najprostsze, a każdy, kto rozprowadza aplikacje Java w słoikach, musi sobie z tym poradzić.Jak utworzyć MANIFEST.MF, który jest dostępny podczas testowania i uruchamiania ze słoika w produkcji?
Po prostu chcę wiedzieć, w jaki sposób dodać wersję do mojej aplikacji Java, aby uzyskać dostęp do informacji o wersji podczas testowania, np. debugowanie w środowisku Eclipse i z poziomu słoika.
Oto co mam w moim build.xml:
<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>
Stwarza /META-INF/MANIFEST.MF i mogę odczytać wartości, kiedy jestem debugowania w Eclipse wygląda następująco:
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.");
}
}
Ale, gdy tworzę plik jar, ładuje manifest innego słoika (przypuszczalnie pierwszym słoiku załadowany przez aplikację - w moim przypadku, activation.jar).
Również poniższy kod nie działa, mimo że wszystkie właściwe wartości znajdują się w pliku manifestu.
Package thisPackage = getClass().getPackage();
String implementationVersion = thisPackage.getImplementationVersion();
Jakieś pomysły?
W aplikacji świata rzeczywistego, który używa żadnych zewnętrznych bibliotek, to jest niezmiernie prawdopodobne, aby powrócić źle oczywisty. –
Nazwa klasy powinna zaczynać się od wielkich liter. Powinien to być PackageVersion zamiast packageVersion. – Carlos