<!--

    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.

-->

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>Apache OpenEJB 6.0.14</TITLE>
<META http-equiv=Content-Type content="text/html">
</HEAD>
<BODY>
<P>
<H3>Apache OpenEJB 3.0-beta-1</H3>
<P></P>
<p><font color="red">OpenEJB 3.0-beta-1 requires JRE 5.0 (not compatible with JRE 6.0).  Read the <a href="RELEASE-NOTES.txt">RELEASE-NOTES</a> for more details.</font></p>

<p>Packaging Details (or "What Should I Download?")
  <ul>
      <li>
          OpenEJB Standlone Server:
          <ul>
              <li><a href="openejb-3.0-beta-1-bin.zip">openejb-3.0-beta-1-bin.zip</a></li>
              <li><a href="openejb-3.0-beta-1-bin.tar.gz">openejb-3.0-beta-1-bin.tar.gz</a></li>
          </ul>
      </li>
      <li>
          OpenEJB for Tomcat (deploy into a Tomcat 6.x server):
          <ul>
              <li><a href="openejb.war">openejb.war</a></li>
          </ul>
      </li>
      <li>
          EJB 3.0 and other examples:
          <ul>
              <li><a href="examples-3.0-beta-1.zip">examples-3.0-beta-1.zip</a></li>
              <li><a href="examples-3.0-beta-1.tar.gz">examples-3.0-beta-1.tar.gz</a></li>
          </ul>
      </li>
      <li>
          Source:
          <ul>
              <li><a href="openejb-3.0-beta-1-src.zip">openejb-3.0-beta-1-src.zip</a></li>
              <li><a href="openejb-3.0-beta-1-src.tar.gz">openejb-3.0-beta-1-src.tar.gz</a></li>
          </ul>
      </li>
  </ul>
</p>

<P>Thank you for using <A href="http://tomee.apache.org/">OpenEJB</A>!.
</P>
<P><B>The Apache OpenEJB Project</B> <BR><A
href="http://tomee.apache.org/">http://tomee.apache.org/</A> </P>
<P>
<P></P></BODY></HTML>
