How to get package version at running Tomcat?
eclipse, java, manifest.mf, maven, tomcat
Solution
Solved by 1) Creating META-INF\MANIFEST.MF in webapp folder with `mvn war:manifest` 2) Coding
version = getClass().getPackage().getImplementationVersion();
if (version==null) {
Properties prop = new Properties();
try {
prop.load(getServletContext().getResourceAsStream("/META-INF/MANIFEST.MF"));
version = prop.getProperty("Implementation-Version");
} catch (IOException e) {
logger.error(e.toString());
}
}
logger.info("Starting App version "+version);
Thanks to @javadude answer at How do I read the manifest file for a webapp running in apache tomcat?
Problem
How to get package version at running Tomcat? I try getClass().getPackage().getImplementationVersion() but this always returns `null`. I guess it is because my war wasn't yet packaged and Tomcat executes .classes (aka exploded war). `META-INF\MANIFEST.MF` is present in final war, but not in `target\<project.name>\META-INF` folder java.lang.Package Package objects contain version information about the implementation and specification of a Java package. This versioning information is retrieved and made available by the ClassLoader instance that loaded the class(es). Typically, it is stored in the manifest that is distributed with the classes. Related is Get Maven artifact version at runtime UPDATE. Before I have already added configuration for war build. But when running Tomcat from Eclipse, I get `null`. ``` <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.1</version> <configuration> <archive> <manifest> <addDefaultImplementationEntries>true</addDefaultImplementationEntries> <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries> </manifest> </archive> <!-- this actually moves classes from \WEB-INF\classes to new jar <archiveClasses>true</archiveClasses> --> </configuration> </plugin> ```