| ------ |
| Maven Code Style And Code Conventions |
| ------ |
| Vincent Siveton |
| ------ |
| 2008-07-05 |
| ------ |
| |
| ~~ 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 |
| |
| Maven Code Style And Code Conventions |
| |
| This document describes how developers and contributors should write code. The reasoning of these styles and conventions is |
| mainly for consistency, readability and maintainability reasons. |
| |
| * Generic Code Style And Convention |
| |
| All working files (java, xml, others) should respect the following conventions: |
| |
| * <<License Header>>: Always add the current {{{http://www.apache.org/legal/src-headers.html#headers}ASF license header}} |
| in all versionned files. |
| |
| * <<Trailing Whitespaces>>: Remove all trailing whitespaces. If your are an Eclipse user, you could use the |
| {{{http://andrei.gmxhome.de/anyedit/}Anyedit Eclipse Plugin}}. |
| |
| ~~ * Using SVN properties like \$Id: \$ => Is it a wanted goal for all files like java or apt? |
| [] |
| |
| and the following style: |
| |
| * <<Indentation>>: <<Never>> use tabs! |
| |
| * <<Line wrapping>>: Always use a 120-column line width. |
| |
| [] |
| |
| <<Note>>: The specific styles and conventions, listed in the next sections, could override these generic rules. |
| |
| * {Java} |
| |
| ** {Java Code Style} |
| |
| The Maven style for Java is mainly: |
| |
| * <<White space>>: One space after control statements and between arguments (i.e. <<<if ( foo )>>> instead of |
| <<<if(foo)>>>), <<<myFunc( foo, bar, baz )>>> instead of <<<myFunc(foo,bar,baz)>>>). |
| No spaces after methods names (i.e. <<<void myMethod(), myMethod( "foo" )>>>) |
| |
| * <<Indentation>>: Always use 4 space indents and <<never>> use tabs! |
| |
| * <<Blocks>>: Always enclose with a new line brace. |
| |
| * <<Line wrapping>>: Always use a 120-column line width for Java code and Javadoc. |
| |
| * <<Readingness>>: Specify code grouping members, if needed. For instance in a Mojo class, you could have: |
| |
| +-----+ |
| public class MyMojo |
| { |
| // ---------------------------------------------------------------------- |
| // Mojo components |
| // ---------------------------------------------------------------------- |
| |
| /** |
| * Artifact factory. |
| * |
| * @component |
| */ |
| private ArtifactFactory artifactFactory; |
| |
| ... |
| |
| // ---------------------------------------------------------------------- |
| // Mojo parameters |
| // ---------------------------------------------------------------------- |
| |
| /** |
| * The POM. |
| * |
| * @parameter expression="${project}" |
| * @required |
| */ |
| private MavenProject project; |
| |
| ... |
| |
| // ---------------------------------------------------------------------- |
| // Mojo options |
| // ---------------------------------------------------------------------- |
| ... |
| |
| // ---------------------------------------------------------------------- |
| // Public methods |
| // ---------------------------------------------------------------------- |
| |
| /** |
| * {@inheritDoc} |
| */ |
| public void execute() |
| throws MojoExecutionException |
| { |
| ... |
| } |
| |
| // ---------------------------------------------------------------------- |
| // Protected methods |
| // ---------------------------------------------------------------------- |
| ... |
| |
| // ---------------------------------------------------------------------- |
| // Private methods |
| // ---------------------------------------------------------------------- |
| ... |
| |
| // ---------------------------------------------------------------------- |
| // Static methods |
| // ---------------------------------------------------------------------- |
| ... |
| } |
| +-----+ |
| |
| [] |
| |
| The following sections show how to set up the code style for Maven in IDEA and Eclipse. |
| It is strongly preferred that patches use this style before they are applied. |
| |
| *** IntelliJ IDEA 4.5+ |
| |
| Download <<<{{{../../developers/maven-idea-codestyle.xml}maven-idea-codestyle.xml}}>>> and copy it to |
| <<<~/.IntelliJIDEA/config/codestyles>>> then restart IDEA. On Windows, try |
| <<<C:\Documents and Settings\<username>\.IntelliJIDEA\config\codestyles>>> |
| |
| After this, restart IDEA and open the settings to select the new code style. |
| |
| *** Eclipse 3.2+ |
| |
| Download <<<{{{../../developers/maven-eclipse-codestyle.xml}maven-eclipse-codestyle.xml}}>>>. |
| |
| After this, select Window \> Preferences, and open up the configuration for Java \> Code |
| Style \> Code Formatter. Click on the button labeled Import... and select the file you |
| downloaded. Give the style a name, and click OK. |
| |
| ** {Java Code Convention} |
| |
| For consistency reasons, our Java code convention is mainly: |
| |
| * <<Naming>>: Constants (i.e. static final members) values should always be in upper case. |
| Using short, descriptive names for classes and methods. |
| |
| * <<Organization>>: Avoid using a lot of public inner classes. Prefer interfaces instead of default implementation. |
| |
| * <<Modifier>>: Avoid using final modifier on all member variables and arguments. |
| Prefer using private or protected member instead of public member. |
| |
| * <<Exceptions>>: Throw meaningful exceptions to makes debugging and testing more easy. |
| |
| * <<Documentation>>: Document public interfaces well, i.e. all non-trivial public and |
| protected functions should include Javadoc that indicates what it does. |
| <<Note>>: it is an ongoing convention for the Maven Team. |
| |
| * <<Testing>>: All non-trivial public classes should include corresponding unit or IT tests. |
| |
| [] |
| |
| ** {JavaDoc Convention} |
| |
| TO BE DISCUSSED |
| |
| * {XML} |
| |
| ** {XML Code Style} |
| |
| The Maven style for XML files is mainly: |
| |
| * <<Indentation>>: Always use 2 space indents, unless you're wrapping a new XML tags line in which case you should |
| indent 4 spaces. |
| |
| * <<Line Breaks>>: Always use a new line with indentation for complex XML types and no line break for simple XML |
| types. Always use a new line to separate XML sections or blocks, for instance: |
| |
| +-----+ |
| <aTag> |
| <simpleType>This is a simple type</simpleType> |
| |
| <complexType> |
| <simpleType>This is a complex type</simpleType> |
| </complexType> |
| </aTag> |
| +-----+ |
| |
| In some cases, adding comments could improve the readability of blocks, for instance: |
| |
| +-----+ |
| <!-- Simple XML documentation --> |
| +-----+ |
| |
| or |
| |
| +-----+ |
| <!-- ====================================================================== --> |
| <!-- Block documentation --> |
| <!-- ====================================================================== --> |
| +-----+ |
| |
| [] |
| |
| ** {Generic XML Code Convention} |
| |
| No generic code convention exists yet for XML files. |
| |
| ** {POM Code Convention} |
| |
| The team has {{{http://maven.40175.n5.nabble.com/Proposal-Pom-Code-Style-WAS-svn-commit-r670264-maven-plugins-trunk-maven-site-plugin-pom-xml-td210642.html#a210643}voted}} |
| during the end of June 2008 to follow a specific POM convention to ordering POM elements. |
| The consequence of this vote is that the {{{http://maven.apache.org/ref/current/maven-model/maven.html}Maven project descriptor}} |
| is <<no more>> considered as the reference for the ordering. |
| |
| The following is the recommended ordering for all Maven POM files: |
| |
| +-----+ |
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| <modelVersion/> |
| |
| <parent/> |
| |
| <groupId/> |
| <artifactId/> |
| <version/> |
| <packaging/> |
| |
| <name/> |
| <description/> |
| <url/> |
| <inceptionYear/> |
| <organization/> |
| <licenses/> |
| |
| <developers/> |
| <contributors/> |
| |
| <mailingLists/> |
| |
| <prerequisites/> |
| |
| <modules/> |
| |
| <scm/> |
| <issueManagement/> |
| <ciManagement/> |
| <distributionManagement/> |
| |
| <properties/> |
| |
| <dependencyManagement/> |
| <dependencies/> |
| |
| <repositories/> |
| <pluginRepositories/> |
| |
| <build/> |
| |
| <reporting/> |
| |
| <profiles/> |
| </project> |
| +-----+ |
| |
| <<Comments>>: |
| |
| [[1]] The \<project/\> element is always on one line. |
| |
| [[2]] The blocks are voluntary separated by a new line to improve the readingness. |
| |
| [[3]] The dependencies in \<dependencies/\> and \<dependencyManagement/\> tags have no specific ordering. Developers |
| are free to choose the ordering, but grouping dependencies by topics (like groupId i.e. <<<org.apache.maven>>>) is a good practice. |
| |
| [] |
| |
| <<Note>>: There existing two alternativs to change order of a pom file |
| {{{http://www.mojohaus.org/tidy-maven-plugin/}Tidy Maven Plugin}} or the |
| {{{https://github.com/Ekryd/sortpom}maven-sortpom-plugin}}. |
| |
| ** {XDOC Code Convention} |
| |
| For consistency and readability reasons, XDOC files should respect: |
| |
| * <<Metadata>>: Always specify metadata in the \<properties/\> tag. |
| |
| * <<Sections>>: Always use a new line with indentation for \<section/\> tags. |
| |
| [] |
| |
| ** {FML Code Convention} |
| |
| For readability reasons, FML files should respect: |
| |
| * <<FAQ>>: Always use a new line with indentation for \<faq/\> tags. |
| |
| [] |
| |
| ~~ * {APT} Do we need any specific APT style/convention? |