In previous posts, I talked about my continuing quest for the fully automated creation of a distribution for our product. First, I talked about downloading release notes from our issue tracker. Then I showed how to add those to our NEWS
file. This time, it’s time for updating some text files.
Our product is parametrized by some properties in property files. For instance, the number of cache pages to use for our embedded database is stored in the xhive.server.cache
property in the file build.properties
. In a typical installation on a production server, you’d want to set this to some high number, since you would have lots of RAM
. However, on our development machines, we are not so fortunate. So the build.properties
file contains a value that works for us developers. But when we build a distribution, we need to increase the value.
Enter the replaceregexp
Ant task. This task lets you replace the occurrence of a given regular expression with a substitution pattern in a file. So the following piece of Ant script sets the property to 150000:
<replaceregexp file="${property.file}" match="(xhive.server.cache\s*=)\s*.+" replace="\1 150000" byline="true"/>
I use a backreference in the regular expression to prevent duplication of xhive.server.cache
. Also note the use of \s*
to match any amount of whitespace.
But once the value is set this high, I can no longer start up our web application on my local machine, since I don’t have the required amount of RAM
for that many cache pages (they’re 4K a piece). So I use a similar piece of code to set it back to the development value once the distribution is built.
I also need to update some shell scripts that start Java programs. These shell scripts specify the maximum amount of RAM
available to the JVM
using the -Xmx
and -Xms
command line options to java
:
<replaceregexp file="${shell.script.file}" match="(-Xmx)[0-9]+(m -Xms)[0-9]+(m)" replace="\1512\2128\3" byline="true"/>
The replace pattern isn’t as readable as I would like with the backreferences \1
, \2
, and \3
, but I still prefer that to the duplication of the command line options.
Note however, that this messes up the file permissions on *nix systems. So I use the chmod
Ant task to fix that:
<chmod file="${shell.script.file}" perm="755"/>
The above code snippets show how to change property values. But I also need to add a value:
<replaceregexp file="${property.file}" match="docato-server\s*=.*" replace="" byline="true"/> <echo file="${property.file}" message="docato-server = ${tomcat.host}/docato-composer${line.separator}" append="true"/>
I first use a replaceregexp
to remove any occurrence of the property, and then add it using the echo
task. The replaceregexp
is necessary to be able to run the Ant script multiple times without the property being added multiple times. Note the use of ${line.separator}
to add a newline in a cross-platform manner.
Image may be NSFW.
Clik here to view.

Clik here to view.

Clik here to view.

Clik here to view.

Clik here to view.

Clik here to view.

Clik here to view.

Clik here to view.

Clik here to view.

Clik here to view.
