<!--
 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.
-->
<html>
<head>
<title>Status File for Apache Commons "Daemon" Component</title>
</head>
<body bgcolor="white">


<div align="center">
<h1>The Apache Commons <em>Daemon</em> Component</h1>
$Id$<br />
<a href="#Introduction">[Introduction]</a>
<a href="#Dependencies">[Dependencies]</a>
<a href="#Release Info">[Release Info]</a>
<a href="#Committers">[Committers]</a>
<br /><br />
</div>


<a name="Introduction"></a>
<h3>1.  INTRODUCTION</h3>

<p>The <em>Daemon</em> Component contains a set of Java and native code,
including:</p>
<ul>
<li>A set of Java interfaces applications must implement</li>
<li>Unix native code to control a Java daemon from a Unix operating system</li>
<li>Win32 code to control a Java daemon from a NT based Windows operating
system</li>
</ul>
<p>This code was originally developped as part of the Tomcat project.</p>


<a name="Dependencies"></a>
<h3>2.  DEPENDENCIES</h3>

<p>The <em>Daemon</em> component is dependent upon the following external
components for development and use:</p>
<ul>
<li><a href="http://java.sun.com/j2se">Java Development Kit</a>
    (Version 1.2 or later)</li>
<li><a href="http://www.junit.org">JUnit Testing Framework</a>
    (Version 3.7 or later) - for unit tests only, not required
    for deployment</li>
</ul>


<a name="Release Info"></a>
<h3>3.  RELEASE INFO</h3>

<p>Current Release: Daemon is yet to be released.  We hope it will be RSN.</p>

<p></p>


<a name="Committers"></a>
<h3>4.  COMMITTERS</h3>

<p>The following individuals are the primary developers and maintainers of this
component.  Developers who plan to use <em>Daemon</em> in their own
projects are encouraged to collaborate on the future development of this
component to ensure that it continues to meet a variety of needs.</p>
<ul>
<li>Jean-Frederic Clere</li>
<li>Pier Fumagalli</li>
<li>Patrick Luby</li>
<li>Costin Manolache</li>
<li>Remy Maucherat</li>
<li>Yoav Shapira</li>
<li>Bill Barker</li>
<li>Sebastian Bazley</li>
<li>Mladen Turk</li>
</ul>


</body>
</html>
