 ------
 Maven Developer Centre
 ------
 Vincent Siveton
 Brett Porter
 ------
 2015-02-14
 ------

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

~~ NOTE: For help with the syntax of this file, see:
~~ https://maven.apache.org/doxia/references/apt-format.html

Maven Developer Centre

  This documentation centre is for people who are Maven developers, or would like to contribute.

  If you cannot find your answers here, feel free to ask the {{{mailto:dev@maven.apache.org}Maven Developer List}}.

* Contributors Resources

  * {{{../guides/development/guide-helping.html}Guide to helping with Maven}}

  * {{{../guides/development/guide-maven-development.html}Developing Maven}}

  * {{{../guides/development/guide-building-maven.html}Building Maven}}

  * {{{../scm.html}Source Code}}

  * {{{https://builds.apache.org/view/M-R/view/Maven/job/maven-box/}Continuous Integration}}

  * {{{../plugin-developers/common-bugs.html}Common Bugs and Pitfalls}}

  * {{{../project-roles.html}Apache Maven Project Roles}}

  []

* Committers Resources

** General Resources

  * {{{./welcome-to-new-committers.html}Guide for new Maven committers}}

  * {{{./committer-environment.html}Committer Environment}}

  * {{{./committer-settings.html}Committer Settings}}
  
  * {{{./retirement-plan-plugins.html}Retirement Plan for Plugins}}

  * {{{./dependency-policies.html}Maven Dependency Policies}}

  []

* Developers Conventions

  There are a number of conventions used in the Maven projects, which contributors and developers alike should follow for
  consistency's sake.

  * {{{./conventions/code.html}Maven Code Style And Conventions}}

  * {{{./conventions/jira.html}Maven JIRA Convention}}

  * {{{./conventions/git.html}Maven Git Convention}}

  []

 <<Note>>: If you cannot find your answers here, feel free to ask the {{{mailto:dev@maven.apache.org}Maven Developer List}}.

* Making Releases

  * {{{./release/pmc-gpg-keys.html}Making GPG Keys}}

  * {{{./release/index.html}Release Process}}

  []

* Maven Website

  * {{{./website/index.html}Deploy Maven Website}}
  
  []

* Other Resources

  * {{{https://www.apache.org/dev/}ASF Development Infrastructure Information}}

  * {{{https://www.apache.org/foundation/}About the Apache Software Foundation}}

  []

~~TODO: tasks as buttons?

~~TODO: de-dupe with existing documents in community

~~TODO: clean up, have cookbook with more in depth documents like cutting releases, etc.
