blob: 9acac13d015d1584564e8a7993cca427da61b6da [file] [log] [blame]
------
Guide to Developing Maven
------
Emmanuel Venisse
Trygve Laugstol
Brett Porter
------
2015-01-04
------
~~ 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:
~~ http://maven.apache.org/doxia/references/apt-format.html
Developing Maven
This document describes how to get started into developing Maven itself. There is a separate page describing how
to {{{./guide-building-maven.html}build Maven}}.
* Finding some work to do
First of all you need something to work on! Issues can be found in
{{{/issue-tracking.html}several JIRA projects}}.
* <<{{{https://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&mode=hide&jqlQuery=project%20%3D%20MNG%20AND%20issuetype%20in%20%28Improvement%2C%20%22New%20Feature%22%2C%20%22Planned%20Work%22%2C%20Request%2C%20Wish%29}JIRA Issues}}>>
[]
When you find a issue you would like to work on add a comment in the issue log so the core developers and other
people looking for work know that someone is already working on it.
* Where's the source?
See {{{/source-repository.html}https://maven.apache.org/source-repository.html}} for information.
The Maven project uses a Git for some things, and Subversion for others, and this
page tracks the situation.
[]
* Don't forget tests!
~~ TODO move details to guide-building-maven.apt, keep only principles here
You will find many unit tests in the maven-3 tree. If at all possible, create or modify a unit test to demonstrate
the problem, and then validate your fix.
If the problem case can't be set up in the unit tests, add an integration test. Before submitting a patch, in any
case, you should run all of the integration tests. The tests require an empty local repository.
See {{{/core-its/core-it-suite/}Core IT Suite documentation}} for more details.
* {Creating and submitting a patch}
When you have either completed an issue or just want some feedback on the work you have done, create a patch
and attach the patch to the issue in question. We have a couple of guidelines when creating patches:
* Patch the trunk, not a tag. Otherwise, your patch is outdated the moment you create it and might not be applicable
to the development head.
* Always create the patch from the root of the Maven project, i.e. where the <<<pom.xml>>> file is.
* If this was a new piece of work without a JIRA issue, create a JIRA issue for it now.
* Name the file <<<MNG-<issue number>-<artifact id>.patch>>>.
* Attach the patch to the JIRA issue you were working on (do not paste its content in as a comment though).
When adding the patch add a comment to the issue explaining what it does. Shortly after, someone will apply the patch
and close the issue.
[]
An example on how to create a patch from the command line:
---
$ svn diff > MNG-123-maven-core.patch
---
If you are picking up an issue with a existing patch attached to the issue you can apply the patch to your working
directory directly from JIRA like this. The <<<wget>>> and <<<patch>>> commands will only be available if you are
on a UNIX platform or using Cygwin on windows.
---
$ wget -O - -q <URL to the patch from JIRA> | patch -p0
---
If the patch is in a local file <<<MNG-123.patch>>> and you want to apply that use this command:
---
$ patch -p0 < MNG-123.patch
---
A couple of notes:
* If you are using another tool for creating patches, make sure that the patch doesn't include absolute paths.
Including absolute paths in the patch will make the useless for us as we most likely don't have the same directory
structure as you.
* Make sure that you follow our code style, see {{{Further_Links}Further Links}}.
[]
* Patch acceptance criteria
There are a number of criteria that a patch will be judged on:
* Whether it works and does what is intended. This one is probably obvious!
* Whether it fits the spirit of the project. Some patches may be rejected as they take the project in a different
direction to that which the current development community has chosen. This is usually discussed on an issue well
before a patch is contributed, so if you are unsure, discuss it there or on the mailing lists first. Feel free to
continue discussing it (with new justification) if you disagree, or appeal to a wider audience on the mailing lists.
* Whether it contains tests. It is expected that any patches relating to functionality will be accompanied by unit tests
and/or integration tests. It is strongly desired (and will be requested) for bug fixes too, but will not be the basis
for not applying it. At a bare minimum, the change should not decrease the amount of automated test coverage.
As a community, we are focusing on increasing the current coverage, as there are several areas that do not receive automated testing.
* Whether it contains documentation. All new functionality needs to be documented for users, even if it is very rough
for someone to expand on later. While rough is acceptable, incomplete is not. As with automated testing, as a community
we are striving to increase the current coverage of documentation.
[]
Above all, don't be discouraged. These are the same requirements the current committers should hold each other to as well.
And remember, your contributions are always welcome!
* Related Projects
Maven has a few dependencies on other projects.
* <<Plexus>>
Plexus is a full-fledged container supporting different kinds of component lifecycles. It's native lifecycle
is like any other modern IoC container, using field injection of both requirements and configuration. All
core Maven functionality are Plexus components.
You can {{{https://codehaus-plexus.github.io/}read more about Plexus}}.
* <<Modello>>
Modello is a simple tool for representing an object model and generate code and resources from the model. Maven is
using Modello to generate all Java objects, XML readers and writers, XML Schema and HTML documentation.
You can {{{https://codehaus-plexus.github.io/modello/}read more about Modello}}.
* <<Mojo>>
"Mojo" is really two things when it comes to Maven: it is both {{{/ref/current/maven-plugin-api/}Maven's plug-in API}}
but also {{{http://www.mojohaus.org}a separate Mojohaus project}} hosting a lot of plugins.
{{{http://www.mojohaus.org}The MojoHaus Project}} is a plugin forge for non-core Maven plugins.
There is also a lower bar for becoming a part of the project.
[]
* Sub Projects
** Maven Surefire
Surefire is a testing framework. It can run regular JUnit tests so you won't have to change anything in your code to
use it. It support scripting tests in BeanShell and Jython and has special "batteries" for writing acceptance and
functional tests for the web and for testing XML-RPC code.
You can {{{/surefire/}read more about Surefire}}.
** Maven Doxia
Doxia is Maven's documentation engine. It has a sink and parser API that can be used to plug in support for input
and output documents.
You can read more about {{{/doxia/}Doxia}} and the currently supported
{{{/doxia/references/index.html}document formats}}.
** Maven SCM
Maven SCM (Source Control Management) is an reusable API which is independent of Maven itself and it is used by the
SCM related Maven Plugins. The core part of Maven itself doesn't depend on Maven SCM.
You can {{{http://maven.apache.org/scm/}read more about Scm}}.
** Maven Wagon
Maven Wagon is also a standalone API that deals with transporting files and directories. Maven Core uses the Wagon
API to download and upload artifacts and artifact metadata and the site plug-in uses it to publish the site.
You can {{{http://maven.apache.org/wagon/}read more about Wagon}}.
* {Further Links}
* {{{../../developers/conventions/code.html}Maven Code Style And Code Convention}}
* {{{../../developers/conventions/jira.html}Maven JIRA Convention}}
* {{{../../developers/conventions/svn.html}Maven SVN Convention}}
[]