Building the Apache PhotArk M3
==============================

Initial Setup
-------------

1) Install J2SE 5.0 SDK, which can be downloaded from 
   http://java.sun.com/j2se/1.5.0/download.jsp. Use version of 1.5.0_06 JDK or higher.

2) Make sure that your JAVA_HOME environment variable is set to the newly installed 
   JDK location, and that your PATH includes %JAVA_HOME%\bin (windows) or 
   $JAVA_HOME$/bin (unix).

3) Install Maven 2.2.1 or higher, which can be downloaded from 
   http://maven.apache.org/download.html. Make sure that your PATH includes 
   the MVN_HOME/bin directory. 

4) Make sure that your MAVEN_OPTS environment variable has -Xmx128M (or more),
   you can manually do this by executing the following in your prompt :
   Windows users:
      set MAVEN_OPTS=-Xmx128M
   Unix users:
      export MAVEN_OPTS=-Xmx128M


Building
--------

1) Change to the top level directory of Apache PhotArk source distribution.
2) Run

	$> mvn

   This will compile Apache PhotArk and run all of the tests in the source
   distribution. 

   Depending on the load of remote Maven 2.0 repositories, you may have 
   to run "mvn" several times utill the required dependencies are 
   all located in your local maven repository. It usually takes some time for 
   maven to download required dependencies in the first build. Once all the 
   dependencies have been downloaded you may use the -o option to run maven
   in offline mode, for example, 'mvn clean install -o'.


Building the distributions
--------------------------

1) Change to the distribution folder
2) Run

	$> mvn

   This will build the binary and source distribution with .zip and .gz 
   formats in the distribution/target directory.
   

Testing UI
-----------
1) Change to the photark-ui-test
2) Deploy the photark.war in Tomcat
3) Start Tomcat
2 Run

	$>mvn -Dtest=*TestBrowser test
	This will run only the htmlunit test cases.
