GARM is a suite of tools for managing GAR archives on J2EE containers.
The features of GARM are as follows:
  • Dependency tracking and conflict resolution
  • Optimised GAR management using repositories
  • Ability to rollback containers to previous states
  • Container normalisation
Dependency tracking enables GARM to correctly uninstall GARs even when multiple GARs depend upon the same file. Conflict resolution at present means that the newest file is kept when installing a file from a GAR means overwriting an existing file. Other conflict resolution strategies are possible, but not yet available in early versions of GARM.
Existing systems for managing GARs on a network of machines often rely either upon maintaining local copies of all the GARs needed on a machine, or on downloading them over NFS or HTTP each time they must be installed. In some systems, this download is performed at every boot to ensure freshness. GARM uses a system of XML descriptors which are much smaller than the GARs they are built from to determine file freshness. The GAR files themselves are downloaded only when files from them are needed.
GARM stores a history of files and their origins. Any file replaced during an install is recorded in the history along with its origin. Assuming the file is still available when the GAR that caused it to be replaced is uninstalled, the file will be reinstalled from its origin. This rollback makes recovering from bad installations very straightforward.
Container normalisation refers to the ability to specify not only that the services offered by a container should include some set of GARs, but also that these should be the ONLY services offered by the container. Because GARM stores meta-information about each container, GarmC is able to take an authoritative list of GARs as an argument and install and uninstall GARs to make the GARs on that list the only ones installed on the container. This is a valuable property for convergent configuration.