BuildNumber — from SVN into your application

Finally found some time to publish BuildNumber — a Maven plugin and Ant task to embed SVN build number into your application during build. Great for tracking what version is deployed where.


rsync IDE project files

The jury is still out on whether to version control the IDE files (see for example this question on StackOverflow). I recently tend to agree with Anton and lend towards not version-controlling or at least keeping them separate.

This little rsync script can help moving all project files to a separate hierarchy so that you can manage them separately from your source tree:

rsync -av \
–filter=’+ */’ \
–filter=’+ .classpath’ \
–filter=’+ .project’ \
–filter=’+ **/*.iml’ \
–filter=’+ .idea/***’ \
–filter=’- *’ \
–prune-empty-dirs $1 $2

Thanks Shane Meyers for the insight into rsync filter patterns.

ProGuard, Mac OS X, runtime libraries and honey

ProGuard is a great tool for packaging your Java Applet or application. We use it mainly to package a program and bunch of dependencies into small .jar file. It works great on Linux and Windows but on my Mac it would end up with messages like:

[proguard] Reading library jar [/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/jsse.jar]
[proguard] Error: Can't read [proguard.ClassPathEntry@50502819] (No such file or directory)

With some help  from the Eric Lafortune, the ProGuard author, the solution was to put a link to the missing file to its “regular” place in Java libraries:

cd $JAVA_HOME/lib
sudo ln -s ../../Classes/classes.jar rt.jar
sudo ln -s ../../Classes/jsse.jar .

The downside is that you should do some manual stuff on each Mac you want to build on. If somebody has better solution I would love to know about it.

In military training long time ago, I and my fellow students were forced to do a lot of things that were illogical, redundant or  outright stupid. Sometimes our only explanation was “so the life wouldn’t seem sweet like honey”. It kind of made sense to make life intentionally hard in the army — it was supposed to be training after all. It seems that the Apple in this case was following the same logic: let’s spread runtime libraries all over the system so that the engineer’s life wouldn’t seem too sweet like honey. Anybody got better explanation, please let me know.

Adding CACert to the Java Trusted Store is a great way to easily create free SSL certificates for development work. In order to successfully connect from Java program using SSL to a server carrying a certificate issued by CACert you need to “bless” the certiticate, or make it trusted by your your local Java JRE installation.

Let’s first make sure we are in the lib/security subdirectory of the currently running JRE:

> cd $JDK_HOME\jre\lib\security

Then, download the certificate file to your local computer:

$JDK_HOME\jre\lib\security> wget
--2010-03-16 09:24:40--
Connecting to||:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2569 (2.5K) [application/x-x509-ca-cert]
Saving to: `root.crt'
100%[======================================>] 2,569       15.4K/s   in 0.2s
2010-03-16 09:24:41 (15.4 KB/s) - `root.crt' saved [2569/2569]

Now let’s import the certificate into the JRE keystore (note the password of the default JRE keystore — it’s different on different platforms):

$JDK_HOME\jre\lib\security> keytool -import -keystore cacerts  -storepass changeit -alias cacert-root1 -trustcacerts -file root.crt Owner:, CN=CA Cert Signing Authority, OU=, O=Root CA
Issuer:, CN=CA Cert Signing Authority, OU=http:/ /, O=Root CA Serial number: 0 Valid from: Sun Mar 30 04:29:49 PST 2003 until: Tue Mar 29 05:29:49 PDT 2033 Certificate fingerprints: MD5:  A6:1B:37:5E:39:0D:9C:36:54:EE:BD:20:31:46:1F:6B SHA1: 13:5C:EC:36:F4:9C:B8:E9:3B:1A:B2:70:CD:80:88:46:76:CE:8F:33 Trust this certificate? [no]:  yes Certificate was added to keystore

Now you are ready to start sending Java SSL requests to your server.

The AHAH! Moment

By my faith! For more than forty years I have been speaking prose without knowing anything about it, and I am much obliged to you for having taught me that.


We have been doing AHAH for a few months and now I know! The thing definitely makes sense, especially as the app gets more complicated and every bit of code shaved off the client side saves us a bit of our lives.

The performance still requires investigation. For now I assume that transparent gzip compression can make HTML snippets just about as small as compressed JSON responses.