Building a GWT application is an easy way for Java Developers to write Ajax applications. However, it can be difficult to release a GWT application to production before it's finished. One of the most important things I've learned in Software Development is to get a new application into production as soon as possible. Not only does getting it from dev → qa → prod verify your process works, it also can do a lot to test the viability of the new application.
When the first feature was completed on my project, the *.cache.html files were around 300K. Rather than using branches to release to QA and UAT, bug fixes and new features were developed on trunk. Unfortunately, the QA and UAT process took several weeks longer than expected so by the time the feature was ready to release, the *.cache.html files had grown to around ~570K. The reason the file had grown so much was because it included all of the other features.
Earlier this week, while running to a dentist appointment, I thought of a solution to this problem. The basic idea was to optimize the compilation process so only the to-be-released feature was included. Even better, the solution didn't require more modularization. The results:
Before: *.cache.html -> 569K, gzipped 175K After: *.cache.html -> 314K, gzipped 100K
According to my calculations, that's a 56% reduction in size. How did I do it?
- Created a new
FeatureName.javaEntryPoint with only the to-be-released features imported.
- Created a new
FeatureName.gwt.xmlthat references the new EntryPoint.
- Copied old (kitchen-sink) EntryPoint.html to
FeatureName.htmland changed the reference to the nocache.js file.
- Created a Maven profile that allows using -PFeatureName to build a FeatureName-only module.
One downside to doing things this way is it's possible to create a WAR that has the same name and different features. Surely the Maven Overlords would frown upon this. Since this is just a temporary solution to release features incrementally, I'm not too worried about it. A possible workaround is to create different WAR names when a feature's profile is activated. I believe the true "Maven way" would be to make the "kitchen sink" application into a JAR and have several WAR modules with the different EntryPoints. Seems a bit complicated to me.
Other than this Maven publishing issue, the only other issue I can foresee is keeping the two EntryPoints and HTML files in synch. Then again, the separate files allow a feature to be customized for the release and can be deleted when its no longer needed.
What do you think? Do you know of a better way to compile a GWT application so it only contains certain features?