<!--

    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>Reusable Services</h1>

We hope to make use of the following fine open source software to help complete  the Geronimo J2EE stack.

<ul>
<li>
<a href="http://mx4j.sourceforge.net/">MX4J</a> for JMX
</li>
<li>
Apache Tomcat or Jetty for Web Container
</li>
<li>
Apache Axis for Web Services Stack
</li>
<li>
Apache's Jakarta James for email
</li>
<li>
OJB for JDO & plugins to the CMP engine (Hibernate is LGPL - the bindings to Geronimo must be outside of Apache)
</li>
<li>
commons-jndi for JNDI - 
(There is currently a JNDI implementation in Tomcat's CVS. It might be better to 
move this to Jakarta Commons so we can all work & extend it - there are various 
features from Jetty and OpenEjb ?we'd like to add? ). 
</li>
<li>
<a href="http://activemq.codehaus.org/">Codehaus' ActiveMQ</a> for JMS
</li>
<li>
<a href="http://jotm.objectweb.org/">ObjectWeb's JOTM</a> for transaction management
</li>
</ul>

</body>
</html>
