How do you create a MANIFEST.MF that's available when you're testing and running from a jar in produ

Posted by warvair on Stack Overflow See other posts from Stack Overflow or by warvair
Published on 2008-09-17T15:28:05Z Indexed on 2010/06/18 11:33 UTC
Read the original article Hit count: 264

Filed under:
|
|
|
|

I've spent far too much time trying to figure this out. This should be the simplest thing and everyone who distributes Java applications in jars must have to deal with it.

I just want to know the proper way to add versioning to my Java app so that I can access the version information when I'm testing, e.g. debugging in Eclipse and running from a jar.

Here's what I have in my 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>

This creates /META-INF/MANIFEST.MF and I can read the values when I'm debugging in Eclipse 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.");
   }

}

But, when I create the jar file, it loads the manifest of another jar (presumably the first jar loaded by the application - in my case, activation.jar).

Also, the following code doesn't work either although all the proper values are in the manifest file.

    Package thisPackage = getClass().getPackage();
    String implementationVersion = thisPackage.getImplementationVersion();

Any ideas?

© Stack Overflow or respective owner

Related posts about java

Related posts about ant