I am using Mercurial HG for versioning my projects. To keep my version-number in my build/compiled programs uptodate I am using this approach. I've modified the build.xml to override a predefined target.

<target name="-pre-compile">
    <!-- getting the version in a fancy format -->
    <exec executable="hg" outputproperty="version.mercurial">
       <arg value="parent"/>
       <arg value="--template"/>
       <arg value="{latesttag}.{rev}-{branch}-{node|short}"/>
    </exec>
    <echo level="warning">Version ${version.mercurial}</echo>
    <manifest file="${manifest.file}" mode="update">
       <attribute name="Implementation-Version" value="${version.mercurial}"/>
   </manifest>
</target>

** note hg.exe is in my classpath.

To retrieve the version property I use the following code snippet in my mainclass

String version = Main.class.getPackage().getImplementationVersion();

When I build my project and run it with this java -jar myproject.jar the version number is correct and from that point everything is fine.

But when I run it in my IDE the version string ist null, so the manifest file isn't read. So this makes me thinking if this approach is valid or is there another, even a simpler way to keep the version number uptodate?

EDIT: Is there a more sophisticated way to include the version number into your program?

有帮助吗?

解决方案

Consider using the output attribute to Ant's <exec ..> task to write a properties file instead. Then you can use the <properties file="..."> method to read it in Ant, and can load it like a normal properties file when running in your IDE.

Good for you for not using the KeywordsExtension for this. It's a horrible solution in a DVCS world.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top