# Maven Checkstyle Plugin Releases History

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

## Maven Checkstyle Plugin Releases History

#macro ( release $version )
<a href="http://checkstyle.sourceforge.net/releasenotes.html#Release_$version">$version</a>
#end

<table>
<tr><th>release date</th><th>maven-checkstyle-plugin version</th><th>minimum Java version</th>
    <th>default <a href="http://checkstyle.sourceforge.net/">Checkstyle</a> version</th></tr>
<tr><td>$dateFormat.format( $currentDate )</td><td>${project.version}</td><td>${javaVersion}</td><td>#release( ${checkstyleVersion} )</td></tr>
<tr><td>2015-03-20</td><td>2.15  </td><td>             6</td><td>#release( "6.1.1" )</td></tr>
<tr><td>2015-02-05</td><td>2.14  </td><td rowspan="13">5</td><td>#release( "5.8" )  </td></tr>
<tr><td>2014-09-18</td><td>2.13  </td>                       <td rowspan="3">#release( "5.7" )  </td></tr>
<tr><td>2014-04-19</td><td>2.12.1</td></tr>
<tr><td>2014-03-12</td><td>2.12  </td></tr>
<tr><td>2013-11-15</td><td>2.11  </td>                       <td rowspan="2">#release( "5.6" )  </td></tr>
<tr><td>2013-02-22</td><td>2.10  </td></tr>
<tr><td>2012-02-25</td><td>2.9.1 </td>                       <td rowspan="2">#release( "5.5" )  </td></tr>
<tr><td>2012-02-12</td><td>2.9   </td></tr>
<tr><td>2011-11-01</td><td>2.8   </td>                       <td rowspan="2">#release( "5.4" )  </td></tr>
<tr><td>2011-08-11</td><td>2.7   </td></tr>
<tr><td>2010-09-25</td><td>2.6   </td>                       <td rowspan="3">#release( "5.0" )  </td></tr>
<tr><td>2010-02-12</td><td>2.5   </td></tr>
<tr><td>2009-11-18</td><td>2.4   </td></tr>
<tr><td>2009-07-14</td><td>2.3   </td><td rowspan="4">1.4</td><td rowspan="2">#release( "4.4" )  </td></tr>
<tr><td>2008-06-04</td><td>2.2   </td></tr>
<tr><td>2006-05-14</td><td>2.1   </td>                        <td rowspan="2">#release( "4.1" )  </td></tr>
<tr><td>2006-01-28</td><td>2.0   </td></tr>
</table>
