/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

Building Apache ServiceMix NMR
===================================

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.

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.0.8 or later, which can be downloaded from
   http://maven.apache.org/download.html. Make sure that your PATH includes 
   the MVN_HOME/bin directory. 


Building
--------

1) Change to the top level directory of Apache ServiceMix NMR source distribution.
2) Run
         $> mvn
   This will compile Apache ServiceMix NMR and run all of the tests in the
   Apache ServiceMix NMR source distribution. Alternatively, you can run
         $> mvn -Pfastinstall
   This will compile Apache ServiceMix NMR without running the tests and takes less
   time to build.
   Depending on the load of remote Maven 2.0 repositories, you may have 
   to run "mvn" several times until 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.
3) The distributions will be available under "assembly/target" directory.

