<?xml version="1.0" encoding="UTF-8"?>

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

<document>
  <properties>
    <title>Welcome to jUDDI</title>
  </properties>
  <body>

      <section name="Intro">
	      <p>jUDDI (pronounced &quot;Judy&quot;) is an open source Java implementation
	        of the Universal Description, Discovery, and Integration (UDDI v3) specification
	        for (Web) Services. The jUDDI project includes <a href="/scout/">Scout</a>. <a href="/scout/">Scout</a> is an implementation 
	        of the JSR 93 - JavaTM API for XML Registries 1.0 (JAXR).</p>
	  </section>
    
	 <section name="jUDDI Features">
	    <ul>
	      <li>Open Source</li>
	      <li>Platform Independent</li>
	      <li>Use with any relational database that supports ANSI standard SQL (MySQL, Oracle, DB2, Sybase, Derby etc.)</li>
	      <li>Deployable on any Java application server that supports the Servlet 2.3 specification</li>
	      <li>jUDDI registry supports a clustered deployment configuration.</li>
	      <li>Easy integration with existing authentication systems</li>
	      <li>Supports InVM embeddable mode</li>
	    </ul>
	    jUDDIv3
	    <ul>
	      <li>UDDI Specification version 3.0 compliant</li>
	      <li>JDK 1.6 Recommended, but supports for JDK 1.5 and later</li>
	      <li>Build on JAXB and JAX-WS standards, tested on CXF</li>
	      <li>Build on JPA standard, tested with OpenJPA and Hibernate</li>
	      <li>Pre-configured bundle deployed to Tomcat</li>
	      <li>UDDI <a href="images/portal-preview.png">portlets</a></li>
	      <li>Pre-configured portal bundle download</li>
	      <li>UDDIv3 API Java Client Library</li>
	      <li>User and Developer Documentation</li>
	    </ul>
	    jUDDIv2
	    <ul>
	      <li>UDDI version 2.0 compliant</li>
	      <li>Supports for JDK 1.3.1 and later</li>
	    </ul>
	  </section>
      
	  <section name="News">
	    <p><strong>May, 2013</strong> jUDDI Release 3.1.5</p>
	    <p><strong>Dec, 2012</strong> Don't forget to check out the <a href="http://apachejuddi.blogspot.com">jUDDI Blog</a></p>
	    <p><strong>Mar, 2012</strong> Scout Release 1.2.6</p>
	    <p><strong>Nov, 2010</strong> Release 3.0.4</p>
	    <p><strong>Aug, 2010</strong> jUDDI and Scout are promoted to Top Level Project named jUDDI</p>
	    <p><strong>May, 2010</strong> Release 3.0.2</p>
	    <p><strong>Oct 26, 2009</strong> Release 3.0.0</p>
	    <p><strong>Aug 11, 2009</strong> <a href="http://apachejuddi.blogspot.com/2009/07/release-juddi-v2-thank-you-steve-viens.html">Release 2.0</a> and <a href="http://www.apache.org/dist/ws/juddi/2_0_1/">2.0.1</a></p>
	    <p><strong>June 5, 2009</strong> Release 3.0.0.beta</p>
	    <p><strong>May 31, 2009</strong> Release 2.0rc7</p>
	    <p><strong>Feb 13, 2009</strong> Version 3.0.0.alpha is now available</p>
	  	<p><strong>Feb 10, 2009</strong> Version 2.0rc6 is now available.</p>
	    <p><strong>Dec 13, 2007</strong> Version 2.0rc5 is now available.</p>
	    <p><strong>June 7, 2005</strong> Version 0.9rc4 is now available.</p>
	    <p><strong>July 2, 2004</strong> Version 0.9rc3 is now available.</p>
	    <p><strong>June 29, 2004</strong> Version 0.9rc2 is now available.</p>
	    <p><strong>June 16, 2004</strong> Version 0.9rc1 is now available.</p>
	    <p><strong>March 24, 2004</strong> jUDDI graduates from the Apache Incubator into Apache Web Services Project.</p>
	    <p><strong>Oct 08, 2003</strong> The Apache Software Foundation's Web Services PMC (http://ws.apache.org/) voted to accept jUDDI into the Apache Incubator. The move is expected to be complete in early December.</p>
	    <p><strong>July 22, 2003</strong> A proposal to contribute jUDDI to the Apache Software Foundation's Web Services Project is being considered.</p>
	    <p><strong>July 22, 2003</strong> Version 0.8.0 is now available.</p>
	    <p><strong>June 27, 2003</strong> Version 0.7.1 is now available.</p>
	    <p><strong>April 22, 2003</strong> Version 0.7.0 is now available.</p>
	  </section>

      <section name="About UDDI">
        <p>The Universal Description, Discovery and Integration (UDDI) protocol is 
          one of the major building blocks required for successful Web services. 
          UDDI creates a standard interoperable platform that enables companies 
          and applications to quickly, easily, and dynamically find and use Web 
          services over the Internet. UDDI also allows operational registries to 
          be maintained for different purposes in different contexts. UDDI is a 
          cross-industry effort driven by major platform and software providers, 
          as well as marketplace operators and e-business leaders within the 
          OASIS standards consortium.
        </p>
        <p>Additional information regarding UDDI can be found 
          at <a href="http://www.uddi.org/">UDDI.org</a>.
        </p>
      </section>
      
  </body>
</document>
