#  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.

#
#  This file contains defaults for development.  If you are cross-
#  developing in multiple environments, just change the defaults
#  in this file.
#
#  Any changes in this file will be reflected in the default
#  jspwiki.properties-file when it is run.
#

Since you have the source, you'll probably want to know how to compile it. 

Some of JSPWiki is in the form of JSP pages, so you don't need to
compile them: the JSP container will take care of that.  However,
there are a bunch of Java files, which you'll want to compile.

Requirements
============

You'll need the following programs:

- J2SDK 5.0 (I use the one from Sun Microsystems; I haven't tested any others.)
- Apache Ant 1.7.1 (available from http://ant.apache.org)
- Servlet API 2.4 (servlet.jar, available from Sun Microsystems.)
- JUnit 3.8.2 (from www.junit.org, required for running tests)

You'll also need Internet access in order to download JSPWiki's dependencies.


Building
========

Ant is the build system.

Everything should Just Compile, when you say 'ant', assuming you have
everything in your path. 

There are few targets:

ant dist   : builds a full distribution.
ant javadoc: builds the javadocs into doc/javadoc
ant compile: just the basic compile, thankyouverymuch
ant tests  : runs JUnit tests.
ant jar    : builds the JSPWiki.jar into build/
ant war    : builds the JSPWiki.war that can be deployed to your webcontainer

You can customize your compilation by changing the contents of the
build.properties file, or better yet, make your own compilation
script where you override the build.properties-property.  For example,
to use your own build.properties-file called "my.properties", make a
small shell script and call it "my_build.sh":

#!/bin/sh
ant -Dbuild.properties=/path/to/my.properties

Eclipse

To be a little bit more productive you probably want to use Eclipse.
To get JSPWiki build from within Eclipse, here are a few guidelines:
- first install the SVN Eclipse Plugin (the JSPWiki sources are in svn.(eu.)apache.org)
- create a new SVN Project and check out the trunk ( (incubator/)jspwiki/trunk)
- the only thing you propably have to change is the buildpath (see properties of the project)
- then the sources should be compiled correctly
- to run a build, switch to the Ant View and add the build.xml buildfile
- then you can choose the Ant target by double clicking on it
- the Ant "init" target must be called at least once in order to download the required dependencies
    

Directory structure
===================

'src' contains the source code (under org/apache/wiki).

'src/webdocs' contains all the files that are published in the final
webapps directory, including all of the deployment files under
WEB-INF.

'src/wikipages' contains a number of ready-made Wikipages called the core pages.
There is a subdirectory for each language that is supported.  
Feel free to use them.

'tests' contains a number of tests which you can run by saying 'ant
tests'.  If any of them fail, you know you've broken something.

'etc' contains all configuration files.

'lib' contains all libraries that are required to run JSPWiki.  Note,
however, that to keep the archive size down, I haven't included them
in the source distribution.  You may need to copy them by hand from
somewhere, or the binary distribution.
