 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.

HOWTOBUILD.txt
==============

For General Users & log4j developers
=====================================
Firstly, you'll need maven 2.0.9+ to build Chainsaw:

http://maven.apache.org


Next, an interim step is required until the 'companions' are voted on and released:

* SVN check out the following projects:
	log4j-component - http://svn.apache.org/repos/asf/logging/log4j/companions/component/trunk/
	log4j-extras - http://svn.apache.org/repos/asf/logging/log4j/companions/extras/trunk/
	log4j-receivers - http://svn.apache.org/repos/asf/logging/log4j/companions/receivers/trunk/

  In each of these checkout directories:
  	mvn install

  This will install into your local maven repository the correct releases of the required dependencies. 
  These dependencies are not yet available in the standard maven repositories, and so failure to complete this step will prevent you from building Chainsaw.

* cd to Chainsaw project checkout directory

	mvn install

This will automatically build and assemble the Chainsaw distribution which includes a .sh & .bat shell script to run Chainsaw.  You can then run Chainsaw as follows:

[*nix]
sh target/appassembler/bin/chainsaw

[Windows]
target/appassembler/bin/chainsaw.bat

[OSX]
You can use the *nix steps above, or go one extra step for a nicer OSX experience

mvn package osxappbundle:bundle

This will create an OSX distribution, look inside the target folder for the packaged OSX application and .dmg distribution.  You can drag the application to your /Applications folder, or just double click it from the target folder.

For log4j developers
====================

Creating a Webstart distribution
================================

To create the Webstart distribution requires:
	* a keystore configured with a valid code signing key
		I've always found this link useful:
			http://www.dallaway.com/acad/webstart/
			
	* A maven profile that defines the parameters for code signing (otherwise passwords and stuff need to be embedded in the pom.xml)
	 	Edit your ${user.home}/.m2/settings.xml file, such that it has something like:

		<settings>
		....
		<profiles>
		....
		  <profile>
		 	<id>chainsaw-signing</id>
		    <properties>
		      <chainsaw.webstart.keystore>/somepath/keystore</chainsaw.webstart.keystore>
		      <chainsaw.webstart.keypass>somesupersecurepassword</chainsaw.webstart.keypass>
		      <chainsaw.webstart.storepass>someothersupersecurepassword</chainsaw.webstart.storepass>
		      <chainsaw.webstart.alias>aliasofcertificateinkeystore</chainsaw.webstart.alias>
		    </properties>
		  </profile>
		...
		</profiles>
		....
		</settings>
		
	Then create the webstart package:
	
	mvn -Pchainsaw-signing install webstart:jnlp
	
	Inside the target folder will contain a .zip file containing the webstart distribution, including the generated .jnlp file.  
	
	
