How to read project specific META/MANIFEST.MF in Spring Boot Web Application?

1.2k views Asked by At

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.

0

There are 0 answers