<!--

    Copyright 2003-2004 The Apache Software Foundation

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<!-- $Rev$ $Date$ -->

<html>
<head>
</head>
<body>
<h1>Introduction</h1>

<p>
Welcome to Apache Geronimo, the J2EE server project of the Apache
Software Foundation.  Please help us make this a world class,
certified J2EE container!
</p>

<p>
The aim of the project is to produce a large and healthy community of J2EE
developers tasked with the development of an open-source, certified J2EE
server that:
</p>

<ul>
<li>
  is licensed under the <a href="http://www.apache.org/licenses/">Apache License</a>
</li>
<li>
  passes Sun's TCK for J2EE 1.4
</li>
<li>
  reuses the best ASF/BSD licensed code available today,
  with new ASF code to complete the J2EE stack.
</li>
</ul>

<h1>Downloads</h1>

<p>
Currently, the Apache Geronimo has no certified releases.  However the
following non-certified milestone releases are available.  These milestone
releases are 'technology demonstrations' and not offered as a J2EE-compatible
server.
</p>

<h2>Binaries</h2>
<p>Release Date: November 10, 2004</p>
<ul>
<li><a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/geronimo-1.0-M3.zip">1.0-M3 zip</a>
    &nbsp;<a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/geronimo-1.0-M3.zip.asc">PGP</a>
    &nbsp;<a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/geronimo-1.0-M3.zip.sha">SHA</a>
    &nbsp;<a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/geronimo-1.0-M3.zip.md5">MD5</a>
</li>
<li>
    <a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/geronimo-1.0-M3.tar.gz">1.0-M3 tar.gz</a>
    &nbsp;<a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/geronimo-1.0-M3.tar.gz.asc">PGP</a>
    &nbsp;<a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/geronimo-1.0-M3.tar.gz.sha">SHA</a>
    &nbsp;<a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/geronimo-1.0-M3.tar.gz.md5">MD5</a>
</li>
<li><a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/geronimo-1.0-M3-installer.jar">Geronimo 1.0 M3 Installer</a> -- this is a test release of the installer.  It's an executable JAR, so install it using <tt>java -jar geronimo-1.0-M3-installer.jar</tt></li>
<li>
   <a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/RELEASE-NOTES-1.0-M3.txt">Release Notes</a>
</li>
</ul>
<p><strong>Note:</strong> The Milestone 3 release did not include an updated
<tt>README</tt> file, and as a result, the instructions included in the README
are incorrect.  Please use the following:</p>
<ul>
  <li><a href="http://svn.apache.org/viewcvs.cgi/*checkout*/geronimo/trunk/README.txt?rev=106435">Corrected Milestone 3 README.txt</a></li>
</ul>

<h2>Source Code</h2>
<ul>
<li>
   <a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/geronimo-1.0-M3-src.zip">1.0-M3 zip</a>
   &nbsp;<a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/geronimo-1.0-M3-src.zip.asc">PGP</a>
   &nbsp;<a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/geronimo-1.0-M3-src.zip.sha">SHA</a>
   &nbsp;<a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/geronimo-1.0-M3-src.zip.md5">MD5</a>
</li>
<li>
    <a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/geronimo-1.0-M3-src.tar.gz">1.0-M3 tar.gz</a>
    &nbsp;<a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/geronimo-1.0-M3-src.tar.gz.asc">PGP</a>
    &nbsp;<a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/geronimo-1.0-M3-src.tar.gz.sha">SHA</a>
    &nbsp;<a href="http://cvs.apache.org/dist/geronimo/v1.0-M3/geronimo-1.0-M3-src.tar.gz.md5">MD5</a>
</li>
</ul>

<br/>
<a href="http://cvs.apache.org/dist/geronimo/KEYS">KEYS</a>

<h1>Background</h1>

<p>
The Java 2, Enterprise Edition (J2EE) platform is employed widely by
organizations implementing enterprise applications. It is commonly used in
business-to-consumer and most recently in Web service deployments.
Most of the largest business organizations today have deployed applications
on a J2EE platform.
</p>

<p>
While the J2EE specification is implemented by a number of large and small
vendors, there is no open source J2EE container available with a BSD or
BSD-derived licence nor is there an open source project today that provides
a fully compliant implementation.  Verifiable compliance with the J2EE
specification is important to business because it ensures that applications
deployed by developers are portable and interoperable across J2EE providers.
As a result organizations large and small have felt compelled to pay
thousands of dollars to commercial vendors in order to deploy applications
based on J2EE compliant servers.
</p>

<p>
The Apache foundation supports several projects that implement pieces of the
J2EE platform such as Servlets, JSP via Jakarta's
<a href="http://jakarta.apache.org/tomcat/">Apache Tomcat</a>,
<a href="http://jakarta.apache.org/taglibs/">Tag Libraries</a>, and
<a href="http://ws.apache.org/axis/">Apache Axis</a>, a Web services stack.
</p>

<p>
The aim of the project is to produce a large and healthy community of J2EE
developers tasked with the development of an open source, certified J2EE
server, that is ASF licensed and passes Sun's TCK reusing the best ASF/BSD
licensed code available today and adding new code to complete the J2EE stack.
</p>

</body>
</html>
