Apache Marmotta (incubating)
===========================

This code repository is still working in progress for the importation of LMF 
into Marmotta.

For more information about the incubation status of the Marmotta project you
can go to the following page:

  http://marmotta.incubator.apache.org


1. Building the Source Distribution
-----------------------------------

Apache Marmotta uses Maven to build, test, and install the software. A basic
build requires downloading and installing Maven and then running:

mvn clean install

This will compile, package and test all Apache Marmotta modules and install
it in your local Maven repository. In case you want to build your own
projects based on some of the libraries provided by Apache Marmotta, this
usually suffices.

The default loglevel for most unit and integration tests executed during the
build is INFO. To change the loglevel for either more or less output, you
can pass the loglevel as system property:

mvn clean install -Droot-level=TRACE|DEBUG|INFO|WARN|ERROR

Note that some of the integration tests start up parts of the Marmotta
platform during execution. The log level for these tests cannot be
changed, as Marmotta is taking over the log configuration in these
cases.

2. Building, Running and Deploying the Wep Application
------------------------------------------------------

Apache Marmotta also includes a default configuration for building a Java
Web Application that can be deployed in any Java Application Server. To
build the web application, first run

mvn clean install

in the project root. Then change to the launchers/marmotta-webapp directory
and run

mvn package

This will create a marmotta.war file in the target/ directory. You can
deploy this archive to any Java Application Server by copying it into
its deployment directory. More details can be found on:

http://marmotta.incubator.apache.org/installation.html


Alternatively, you can directly startup the Apache Marmotta Web Application
from Maven with a default configuration suitable for development. To try this
out, run

mvn tomcat7:run

wait until the system is started up and point your browser to
http://localhost:8080

When developing it is sometimes useful to always start with a clean confi-
guration of the system. Therefore, you can also start up the web application
as follows:

mvn clean tomcat7:run -Pcleanall

This command will remove any existing configuration directory before startup.



3. Building the Standalone Installer
------------------------------------

The build environment also offers to automatically build an installer package
that guides users through the installation with an easy-to-use installation
wizard. The installer is based on izPack and dynamically assembled when
building the package. To build the installer, first run

mvn clean install

in the project root. Then change to the launchers/marmotta-installer directory
and run

mvn package -Pinstaller

The build process will automatically create an appropriate installer confi-
guration from the Maven dependencies through the Apache Marmotta refpack
build plugin.

The installer can then be tried out by running

java -jar target/marmotta-installer-x.x.x.jar


4. Building with a Clean Repository
-----------------------------------

Sometimes it is useful to check if the build runs properly on a clean local
repository, i.e. simulate what happens if a user downloads the source and
runs the build. This can be achieved by running Maven as follows:

mvn clean install -Dmaven.repo.local=/tmp/testrepo

The command changes the local repository location from ~/.m2 to the
directory passed as argument


5. Simulating a Release
-----------------------

To test the release build without actually deploying the software, we have
created a profile that will deploy to the local file system. You can
simulate the release by running

mvn clean deploy -Pdist-local,marmotta-release,installer

Please keep in mind that building a release involves creating digital
signatures, so you will need a GPG key and a proper GPG configuration to run
this task.