Application Package Manager with Ant and Java

Let's build a simple but powerful application package manager with Ant.


Everyone knows the operation systems package manager like dpkg (from Debian) or RPM Package Manager (from RedHat).

Sometimes there is a need of such a management system in our own use.

The environment doesn't have to be an operation system, but for instance a web server or just a container application.

The manager must be able to manage package dependencies, versions and installation to the environment system.

All the information must be contained only inside the application itself, the system nor the manage must not have any additional data about a concrete package.

To distinguish between a package and a package manager we will use in our context terms Application Package (AP) and Application Package Manager (APM).

Scenario One: Container Application

We want to develop a container application which on the starup checks the application folder and install included application if not installed yet.

Consider an application which simulates an operation system. It has a core, folder for configuration, run and so one. In the simplest case:

/applications/
/system/
       /conf/
            /applications.conf
       /core/
            /lib/
                /apm.jar
                /system.jar
            /apm.xml
       /data/
       /start.bat

The file conf/applications.conf contains pairs of application-name=files-in-bin-directory-comma-separated. It's empty with a brand new system installation or contains some initial system-provided application and files.

The system calls the APM (core/apm.xml) after the start.bat script is executed. The APM takes care of the applications installation. Then a system program (from the library core/lib/system.jar) goes thru the conf/application.conf and run each application logic (in our case only prints the content of a file defined by the application).

The applications directory stands outside the system directory, it means even when the system is completely updated remains the applications directory untouched and the included application are always ready for a new installation by the next startup.

AP Implementation

An AP is nothing more than a folder with a strict defined structure containing all the needed system-related information about itselft. We will put all the AP-related files into the META-INF sub-folder.

Every AP must have a meta information file. We will create a ordinary property file and call it meta.info. The meta information file contains the name, version and dependencies (optionally) of the AP.

For our example we need data to be executed (their content will be printed after the system start). We will put them into data folder. 

META-INF/
        /data/
        /meta.info

For an application to be deployed must be the application folder named in the pattern name-version (e.g. code>MySuperAppA-1.0) and placed in the applications folder. This is the default place for the APM to look for the new APs.

Demo APs 

For the test purposes let's create three APs: A, B, C with the following dependencies:

A --> B, C
B --> C
C --> (no dependency)

Each AP has two text files called be the pattern ap-name-1.txt and ap-name-2.txt with the content of the name of the AP and number of the data file.

For example the AP named B contains in the folder META-INF/data a file B-1.txt with the content "B1" and a file B-2.txt with the content "B2".

After start of the demo system, we should see the following output:

C1
C2
B1
B2
A1
A2 

The order of the startups follows the dependencies definitions of the APs.

APM Implementation

First of all we need two Ant task for our APM script. The implementation of both is in the core/lib/apm.jar Java library and could be found in the source codes under the ant-lib project.

Dependencies order

This task takes a path as a parameter, goes thru this directory and gets all the folders inside it as an input.

Then goes thru all of them and checks the dependencies from the META-INF/meta.info. So it creates a list of dependencies in the order of the need. For each application in the list a sequence inside the task will be executed. The sequence defines the installation procedure.

<taskdef name="dependencies-order" classname="cz.net21.ttulka.apm.ant.demo.DependenciesOrderTask"
         classpath="core/lib/apm.jar" />
...
<dependencies-order path="../applications" relpathmetainfofile="META-INF/meta.info">
    <sequential>
        <antcall target="install-app">
            <param name="appPath" value="@{application}" />
        </antcall>
    </sequential>
</dependencies-order>

Configuration record 

For every application we need to scan the data folder and create a list of the files inside. This list in comma-separated form will be appended into the applications configuration file.

<taskdef name="create-conf-record" classname="cz.net21.ttulka.apm.ant.demo.CreateConfRecordTask"
         classpath="core/lib/apm.jar" />
...
<create-conf-record path="${appPath}/META-INF/data">
    <sequential>
        <antcall target="write-conf-record">
            <param name="record" value="@{record}" />
        </antcall>
    </sequential>
</create-conf-record>
...
<target name="write-conf-record">
    <echo file="conf/applications.conf" append="true">${line.separator}${appName}=${record}</echo>
</target> 

Scenario Two: Application (Web) Server 

Such a APM could be used in the same way in the case of installing web applications into a server

Consider that the applications provide some functional services and their installation is dependent on one or more other.

We can also install more versions of an application and enable only the latest version.

For a proper run of an application the server needs to be configurated in a way known only to the application self.

Application must be corretly re-installed after an update of the server, even when the old server data was completely removed.

Even here helps the APM in all the above mentioned cases. 

Downloads

You can download the source project and addapt it to your needs and desires.