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

<faqs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://maven.apache.org/FML/1.0"
  xsi:schemaLocation="http://maven.apache.org/FML/1.0 http://maven.apache.org/xsd/fml-1.0.xsd"
  title="Information for Maven 1.0 Users">
  <part id="maven1">
    <faq id="changed">
      <question>What's Changed?</question>
      <answer>
        <p>
          Maven 2.0 will feel very different to a Maven 1.0 user - and perhaps a little strange. But it is a lot simpler
          to work with and closer to how Maven was always meant to be! The key changes from Maven 1.0 are:
        </p>
        <ul>
          <li>
            <i>Faster and smaller</i>
            - The Maven core no longer uses Ant, Jelly or Xerces making it much smaller, has
            fewer dependencies, and is perfect for embedding in other tools.
          </li>
          <li>
            <i>Defined build lifecycle</i>
            - No more
            <code>prereqs</code>
            ,
            <code>preGoals</code>
            and
            <code>postGoals</code>
            .
            The build is a series of well defined phases. This also means that the normal goal names are not used -
            <code>compile</code>
            ,
            <code>test</code>
            and
            <code>install</code>
            work for any project type.
          </li>
          <li>
            <i>Built-in multiple project handling</i>
            - Use the same goals on a set of projects, and aggregate the
            results.
          </li>
          <li>
            <i>Improved
              <code>SNAPSHOT</code>
              handling
            </i>
            - Snapshots are now checked for updates only once per day by
            default - though can be configured to be once per build, on a particular interval, or never. A command line
            option can force a check - making it more like updating from an SCM.
          </li>
          <li>
            <i>No more properties files</i>
            - All plugins are now configured from the POM (which is now called
            <code>pom.xml</code>
            ).
          </li>
          <li>
            <i>No more
              <code>maven.xml</code>
            </i>
            - Plugins are now easier to build and integrate, and are the only way
            to script your builds. (Note that additions may later be made to the POM to allow simple things that
            scripting
            was used for, such as goal aliasing).
          </li>
          <li>
            <i>No more Jelly</i>
            - Plugins are primarily written in Java, though there are providers for other scripting languages.
          </li>
          <li>
            <i>Improved repository layout</i>
            - Maven 2.0 supports both the existing layout, and an improved repository
            layout that has deeper, partitioned structure making it easier to browse.
          </li>
        </ul>
      </answer>
    </faq>
    <faq id="m1-or-m2">
      <question>Should I use Maven 2.0, or Maven 1.0?</question>
      <answer>
        <p>
          Maven 2.0 is the latest stable release, and we certainly recommend it for all new projects.
        </p>
        <p>
          If you are already using Maven 1.0 - you should try out Maven 2.0, as it is very much improved.
          However, we still continue to support the Maven 1.x releases at this time.
        </p>
        <p>
          If you do use Maven 1.0, and would like to upgrade in the future, you should carefully consider following some
          of the
          <a href="http://maven.apache.org/maven-1.x/using/bestpractices.html">Best Practices</a>
          listed. These will make your project a lot easier to migrate in the future.
        </p>
        <p>
          The following are the known limitations in the current Maven 2.0 release compared to Maven 1.x:
        </p>
        <ul>
          <li>
            <i>Availability of plugins</i>
            - While most of the core Maven 1.x plugins have been converted,
            several 3rd party plugins may not be available. Maven 2.0 cannot execute Maven 1.0 plugins.
          </li>
        </ul>
      </answer>
    </faq>
    <faq id="m1-future">
      <question>What will happen to Maven 1.0?</question>
      <answer>
        <p>
          Support for Maven 1.0.2 has been discontinued with the release of Maven 1.1.
          While significant new features will not be added to the
          <a href="http://maven.apache.org/maven-1.x/">Maven 1.x</a> core
          (such as transitive dependencies), bugfixes and support continue and the
          repository is still available.
        </p>
      </answer>
    </faq>
    <faq id="m1-plugins">
      <question>Will my Maven 1.0 plugins be supported?</question>
      <answer>
        <p>
          Not directly.
        </p>
        <p>
          We recommend building your Jelly plugins as thin wrappers around Java beans that do not use Maven 1.0 API's,
          which will allow easy migration to Maven 2.0.
        </p>
      </answer>
    </faq>
    <faq id="m1-maven-xml">
      <question>How do I write custom scripts without a
        <code>maven.xml</code>
        file?
      </question>
      <answer>
        <p>Taken from
          <a href="http://mail-archives.apache.org/mod_mbox/maven-users/200504.mbox/%3c1113788711.5625.30.camel@172.16.1.36%3e">
            this post to the Maven User's List</a>:
        </p>
        <blockquote>
          Everything in m2 is a plugin so for doing any sort of custom work like
          that you will need to make a plugin. This 1) greatly reduces the
          complexity within m2 because we only deal with proper plugins. The
          maven.xml file in m1 was a psuedo plugin essentially and greatly
          complicated the internals and 2) it promotes the sharing of your work
          right from the get go. To start with you'll probably write a plugin that
          is only applicable to your specific requirements, or your team's work,
          but you'll see people asking for some functionality and you'll go "hey,
          I have something like that!" and hopefully people who have concrete
          solutions will generalize their solutions so they can be shared with
          others. That's what we're trying to encourage.
        </blockquote>
        <blockquote>
          We estimate that there's a lot of work bound up in project's maven.xml
          that is not being shared and we'd like to try and change that. We plan
          to make it dead simple to share plugins and hopefully people can use
          other project's plugins as a start for a plugin that they may need
          themselves.
        </blockquote>
      </answer>
    </faq>
    <faq id="convert">
      <question>How do I convert from Maven 1.x to Maven 2.x?</question>
      <answer>
        This is dicussed in <a href="http://maven.apache.org/guides/mini/guide-m1-m2.html">Guide to Moving from Maven 1.x to Maven 2.x</a>.
      </answer>
    </faq>
  </part>
</faqs>

