Lucene Build Instructions

Basic steps:
  0) Install JDK 1.7 (or greater), Ant 1.8.2+, Ivy 2.2.0
  1) Download Lucene from Apache and unpack it
  2) Connect to the top-level of your Lucene installation
  3) Install JavaCC (optional)
  4) Run ant

Step 0) Set up your development environment (JDK 1.7 or greater,
Ant 1.8.2+, Ivy 2.2.0)

We'll assume that you know how to get and set up the JDK - if you
don't, then we suggest starting at http://java.sun.com and learning
more about Java, before returning to this README. Lucene runs with
JDK 1.7 and later.

Like many Open Source java projects, Lucene uses Apache Ant for build
control.  Specifically, you MUST use Ant version 1.8.2+.

Ant is "kind of like make without make's wrinkles".  Ant is
implemented in java and uses XML-based configuration files.  You can
get it at:

  http://ant.apache.org

You'll need to download the Ant binary distribution.  Install it
according to the instructions at:

  http://ant.apache.org/manual

Finally, you'll need to install ivy into your ant lib folder
(~/.ant/lib). You can get it from http://ant.apache.org/ivy/.
If you skip this step, the Lucene build system will offer to do it 
for you.

Step 1) Download Lucene from Apache

We'll assume you already did this, or you wouldn't be reading this
file.  However, you might have received this file by some alternate
route, or you might have an incomplete copy of the Lucene, so: Lucene
releases are available for download at:

  http://www.apache.org/dyn/closer.cgi/lucene/java/

Download either a zip or a tarred/gzipped version of the archive, and
uncompress it into a directory of your choice.

Step 2) From the command line, change (cd) into the top-level directory of your Lucene installation

Lucene's top-level directory contains the build.xml file. By default,
you do not need to change any of the settings in this file, but you do
need to run ant from this location so it knows where to find build.xml.

If you would like to change settings you can do so by creating one 
or more of the following files and placing your own property settings
in there:

    ~/lucene.build.properties
    ~/build.properties
    lucene-x.y/build.properties

The first property which is found in the order with which the files are
loaded becomes the property setting which is used by the Ant build
system.

NOTE: the ~ character represents your user account home directory.

Step 3) Run ant

Assuming you have ant in your PATH and have set ANT_HOME to the
location of your ant installation, typing "ant" at the shell prompt
and command prompt should run ant.  Ant will by default look for the
"build.xml" file in your current directory, and compile Lucene.

If you want to build the documentation, type "ant documentation".

For further information on Lucene, go to:
  http://lucene.apache.org/

Please join the Lucene-User mailing list by visiting this site:
  http://lucene.apache.org/core/discussion.html

Please post suggestions, questions, corrections or additions to this
document to the lucene-user mailing list.

This file was originally written by Steven J. Owens <puff@darksleep.com>.
This file was modified by Jon S. Stevens <jon@latchkey.com>.

Copyright (c) 2001-2005 The Apache Software Foundation.  All rights reserved.
