<!--
    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.
-->
<!DOCTYPE html>
<html>
  <head>
    <title>Apache Beam Java SDK</title>
  </head>
  <body>
    <p>The Apache Beam SDK for Java provides a simple and elegant
       programming model to express your data processing pipelines;
       see <a href="https://cloud.google.com/dataflow/">our product page</a>
       for more information and getting started instructions.</p>

    <p>The easiest way to use the Apache Beam SDK for Java is via
       one of the released artifacts from the
       <a href="http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.apache.beam%22">
       Maven Central Repository</a>.

    <p>Version numbers use the form <i>major</i>.<i>minor</i>.<i>incremental</i>
       and are incremented as follows:<p>
    <ul>
      <li>major version for incompatible API changes</li>
      <li>minor version for new functionality added in a backward-compatible manner</li>
      <li>incremental version for forward-compatible bug fixes</li>
    </ul>

    <p>Please note that APIs marked
    {@link org.apache.beam.sdk.annotations.Experimental @Experimental}
    may change at any point and are not guaranteed to remain compatible across versions.</p>
  </body>
</html>
