I'm working on a Spring Boot MVC application. The requirement is to read the MANIFEST.MF file to get build number and application version number etc of this spring boot app.
For this, I have written the following bean definition for Manifest Class so that I can autowire it in the Controller class.
@Configuration
public class AppConfig{
@Bean("manifest")
public java.util.jar.Manifest getManifest()
{
// get the full name of the application manifest file
String appManifestFileName = this.getClass().getProtectionDomain().getCodeSource().getLocation().toString() + JarFile.MANIFEST_NAME;
Enumeration resEnum;
try
{
// get a list of all manifest files found in the jars loaded by the app
resEnum = Thread.currentThread().getContextClassLoader().getResources(JarFile.MANIFEST_NAME);
while (resEnum.hasMoreElements())
{
try
{
URL url = (URL) resEnum.nextElement();
System.out.println("Resource url=" + url.toString());
// is the app manifest file?
if (url.toString().equals(appManifestFileName))
{
// open the manifest
InputStream is = url.openStream();
if (is != null)
{
// read the manifest and return it to the application
Manifest manifest = new Manifest(is);
return manifest;
}
}
}
catch (Exception e)
{
// Silently ignore wrong manifests on classpath?
}
}
}
catch (IOException e1)
{
// Silently ignore wrong manifests on classpath?
}
return null;
}
}
The above code is taken from here. But it didn't help. It is always giving me null object.
AppController.java
@RestController
public class AppController
{
@Autowired
private Environment env;
@Autowired
@Qualifier("manifest")
private Manifest manifest;
@GetMapping("/get-app-details")
public String getAppDetails()
{
Attributes mainAttributes = manifest.getMainAttributes();
String buildNum = mainAttributes.getValue("Build-Number");
buildNum = buildNum.substring(buildNum.lastIndexOf('_') + 1);
String AppVersion = env.getProperty("App.Version") + "." + buildNum;
return "Build Number - " + buildNum + ", AppVersion - " + AppVersion;
}
}
Additional info - I'm using gradle to build this application as a war file and deploying it into external tomcat version 9.