              Apache Commons Parent 52
                  RELEASE NOTES

The Apache Commons Parent team is pleased to announce the release of Apache Commons Parent 52

The Apache Commons Parent POM provides common settings for all Apache Commons components.

Add support for Java 15.

Changes in this version include:

New features:
o                   Align Javadoc version with java override profile

Changes:
o                   Update maven-site-plugin version 3.8.2 -> 3.9.1.
o                   Update biz.aQute.bndlib version 5.1.0 -> 5.1.2, Java 15 support.
o                   Update maven-bundle-plugin from 4.2.1 to 5.1.1, Java 15 support.
o                   Update animal-sniffer-maven-plugin from 1.18 to 1.19.
o                   Update build-helper-maven-plugin from 3.1.0 to 3.2.0.
o                   Update commons.checkstyle-plugin.version from 3.1.0 to 3.1.1.


Historical list of changes: https://commons.apache.org/commons-parent-pom.htmlchanges-report.html

For complete information on Apache Commons Parent, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons Parent website:

https://commons.apache.org/commons-parent-pom.html

Have fun!
-Apache Commons Parent team

-----------------------------------------------------------------------------


              Apache Commons Parent 51
                  RELEASE NOTES

The Apache Commons Parent team is pleased to announce the release of Apache Commons Parent 51

The Apache Commons Parent POM provides common settings for all Apache Commons components.

Fix incompatibilty issues with Java 7
Add support for Java 13.
Update various plugin versions.

Changes in this version include:

New features:
o  Allow override of changes.announcementFile/announcementDirectory

Fixed Bugs:
o  Allow Java7 builds: commons.animal-sniffer.version=1.17; biz.aQute.bndlib.version=3.5.0
o  PR#5: change <docEncoding> to <docencoding> for maven javadoc plugin.

Changes:
o  JApiCmp 0.14.1 -> 0.14.3.
o  maven-enforcer-plugin 3.0.0-M2 -> 3.0.0-M3.
o  maven-source-plugin 3.2.0 -> 3.2.1.
o  commons.spotbugs.version 3.1.6 -> 3.1.12.2.
o  org.apache:apache 21 -> 23.
o  maven-javadoc-plugin 3.1.1 -> 3.2.0.
o  commons.pmd.version 3.12.0 -> 3.13.0.
o  Fix https://github.com/bndtools/bnd/issues/3903 seen with Commons CSV.
o  commons.project-info.version 3.0.0 -> 3.1.0
o  Add support for Java 13
o  Support NOTICE and LICENSE alongside .txt versions
o  commons.wagon-ssh.version 3.0.0 -> 3.1.0
o  biz.aQute.bndlib.version 5.0.1 => 5.1.0
o  bcel version 6.4.1 => 6.5.0
o  maven pre-requisite 3.0.5 => 3.5.0
o  commons.build-helper.version 3.0.0 => 3.1.0


Historical list of changes: https://commons.apache.org/commons-parent-pom.htmlchanges-report.html

For complete information on Apache Commons Parent, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons Parent website:

https://commons.apache.org/commons-parent-pom.html

-----------------------------------------------------------------------------


              Apache Commons Parent 50
                  RELEASE NOTES

The Apache Commons Parent team is pleased to announce the release of Apache Commons Parent 50

The Apache Commons Parent POM provides common settings for all Apache Commons components.

Notes on site generation in 50
------------------------------

This release updates commons-skin which is used by projects to render the site using a
'Commons' style. It restores the correct copyright notice to the footer of site pages.
The new skin allows a project to add custom XHTML to the <head> tag of their site
descriptor (site.xml).


Changes in this version include:

Changes:
o site.xml: Removed custom head element. PrettyPrint functionality is loaded by commons-skin-4.2.
o site.xml: commons-skin 4.1 -> 4.2
o site.xml: Removed CDATA tag around the custom footer element
o commons.wagon-ssh.version 3.3.3 -> 3.3.4
o commons.assembly-plugin.version 3.1.1 -> 3.2.0
o commons.source-plugin.version 3.1.0 -> 3.2.0
o commons.jar-plugin.version 3.1.2 -> 3.2.0
o jacoco-maven-plugin 0.8.4 -> 0.8.5
o Move japicmp reporting section to the profile for opt-in behavior. Remove japicmp.skip flag used to skip the report.
o Disable jacoco non-aggregate reports.
o Update site build from Apache Commons BCEL 6.3.1 to 6.4.1.


Historical list of changes: https://commons.apache.org/commons-parent-pom.htmlchanges-report.html

For complete information on Apache Commons Parent, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons Parent website:

https://commons.apache.org/commons-parent-pom.html

Have fun!
-Apache Commons Parent team

-----------------------------------------------------------------------------


              Apache Commons Parent 49
                  RELEASE NOTES

The Apache Commons Parent team is pleased to announce the release of Apache Commons Parent 49

The Apache Commons Parent POM provides common settings for all Apache Commons components.

Changes in this version include:

New features:
o Add commons.pmd.version
o Add commons.checkstyle-plugin.version
o Add property commons.release.4.desc (see Apache Commons Pool.)
o Add property commons.release.4.binary.suffix (see Apache Commons Pool.)

Fixed Bugs:
o Downdate felix plugin to work on Java 7
o commons.scmPubUrl was not built properly, e.g. using 'pool' instead of 'commons-pool'

Changes:
o maven-site-plugin 3.7.1 -> 3.8.2
o commons.felix.version=maven-bundle-plugin 4.2.0 -> 4.2.1
o commons-build-plugin 1.10 -> 1.11
o Update maven-project-info-reports-plugin's Apache Commons BCEL from 6.3 to 6.3.1.
o japicmp-maven-plugin 0.13.0 -> 0.13.1
o maven-bundle-plugin 4.1.0 -> 4.2.0
o japicmp-maven-plugin 0.13.1 -> 0.14.0
o japicmp-maven-plugin should not break builds on source incompatible changes by default.
o commons.compiler.version 3.8.0 ->3.8.1.
o Add properties commons.javadoc6.java.link through commons.javadoc12.java.link
o Add properties commons.javadoc.javaee5.link through commons.javadoc.javaee7.link
o Maven Surefire and Failsafe plugins 2.22.1 -> 2.22.2
o commons.jar-plugin.version 3.1.1 -> 3.1.2
o Add profile java-1.12
o maven-source-plugin 3.0.1 -> 3.1.0
o japicmp-maven-plugin 0.14.0 -> 0.14.1
o commons.wagon-ssh.version 3.3.2 -> 3.3.3
o commons.javadoc.version 3.1.0 -> 3.1.1
o Add missing source config for Javadoc plugin.
o Adding Java 8 default methods should not break binary compatibility.
o Set Javadoc source option to Maven compiler source setting.
o jacoco-maven-plugin 0.8.3 -> 0.8.4.
o commons-release-plugin 1.6 -> 1.7.
o animal-sniffer-maven-plugin 1.17 -> 1.18.


Historical list of changes: https://commons.apache.org/commons-parent-pom.htmlchanges-report.html

For complete information on Apache Commons Parent, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons Parent website:

https://commons.apache.org/commons-parent-pom.html

-----------------------------------------------------------------------------

              Apache Commons Parent 48
                  RELEASE NOTES

The Apache Commons Parent team is pleased to announce the commons-parent-48 release!

The Apache Commons Parent POM provides common settings for all Apache Commons components.

Changes in this version include:


Fixed Bugs:
o Revert revert change in commons.scmPubUrl in Parent 47, use commons.packageId for osgi
o Revert change in commons.scmPubUrl in Parent 47  Issue: COMMONSSITE-124.
o re-enabled japicmp and introduced japicmp.skip property that
                controls whether japicmp reports are run. It is disabled by
                default and enabled via a special profile enabled by the
                presence of the file src/site/resources/profile.japicmp
                - org.apache.felix:maven-bundle-plugin 3.5.0 -> 3.5.1

Changes:
o Run "apache-rat:check" as part of "mvn validate"
o commons.build-plugin.version: 1.9 -> 1.10
o commons.release-plugin.version: 1.5 -> 1.6
o commons.spotbugs.version: 3.1.3 -> 3.1.6
o japicmp-maven-plugin: 0.12.0 -> 0.13.0
o Update parent from org.apache:apache 19 to 20.
o maven-compiler-plugin 3.7.0 -> 3.8.0
o org.apache.felix:maven-bundle-plugin 3.5.0 -> 3.5.1
o org.jacoco:jacoco-maven-plugin 0.8.1 -> 0.8.3 (Java 11)
o org.apache.maven.wagon:wagon-ssh 3.1.0 -> 3.2.0
o maven-surefire-plugin 2.22.0 -> 2.22.1
o maven-surefire-report-plugin 2.22.0 -> 2.22.1
o maven-failsafe-plugin 2.22.0 -> 2.22.1
o versions-maven-plugin 2.5 -> 2.7
o org.apache.felix:maven-bundle-plugin 3.5.1 -> 4.1.0
o maven-jxr-plugin 2.5 -> 3.0.0
o org.apache.rat:apache-rat-plugin 0.12 -> 0.13
o commons.wagon-ssh.version 3.2.0 -> 3.3.1
o maven-assembly-plugin 3.1.0 -> 3.1.1
o commons.jar-plugin.version 3.1.0 -> 3.1.1
o commons.animal-sniffer.version 1.16 -> 1.17
o org.apache.bcel:bcel 6.2 -> 6.3
o commons-release-plugin 1.4 -> 1.5
o org.apache.maven.wagon:wagon-ssh 3.3.1 -> 3.3.2
o org.apache.maven.plugins:maven-javadoc-plugin 3.0.1 -> 3.1.0


Historical list of changes: https://commons.apache.org/commons-parent-pom.html

For complete information on Apache Commons Parent, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons Parent website:

https://commons.apache.org/commons-parent-pom.html

-----------------------------------------------------------------------------

              Apache Commons Parent 47
                  RELEASE NOTES


The Apache Commons Parent team is pleased to announce the commons-parent-47 release!

The Apache Commons Parent POM provides common settings for all Apache Commons components.

Changes in this version include:

New features:
o New properties: commons.distSvnStagingUrl, commons.releaseManagerName, commons.releaseManagerKey


Changes:
o Set the version of Apache Commons BCEL used by maven-project-info-reports-plugin to avoid
                "org.apache.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19"
o Allows JApiCmp's ignoreMissingClasses parameter to be easily overridable with the property commons.japicmp.ignoreMissingClasses.
o japicmp-maven-plugin 0.11.1 -> 0.12.0
o maven-javadoc-plugin 3.0.0 -> 3.0.1 (Java 10 compatibility)
o maven-site-plugin 3.7.0 -> 3.7.1.
o org.apache.maven.wagon:wagon-ssh 3.0.0 -> 3.1.0
o maven-surefire-report-plugin 2.21.0 -> 2.22.0
o maven-enforcer-plugin 3.0.0-M1 -> 3.0.0-M2
o commons-release-plugin 1.2 -> 1.3
o commons-build-plugin 1.8 -> 1.9
o maven-surefire-plugin 2.21.0 -> 2.22.0
o maven-project-info-reports-plugin 2.9 -> 3.0.0


Historical list of changes: https://commons.apache.org/commons-parent-pom.html

For complete information on Apache Commons Parent, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons Parent website:

https://commons.apache.org/commons-parent-pom.html

-----------------------------------------------------------------------------

              Apache Commons Parent 46
                  RELEASE NOTES

The Apache Commons Parent team is pleased to announce the commons-parent-46 release!

The Apache Commons Parent POM provides common settings for all Apache Commons components.

Updates plugins and generally requires Java 7.

Plugin updates

Notes on japicmp usage in 46
----------------------------
For japicmp to work when running 'mvn site', we must first run package
because japicmp needs a built artifact to which to compare the previous
version. Thus, we run 'mvn package site' to get an appropriate japicmp
report. Further, during project build we see the following warning and
stacktrace during site generation:

[debug] No packaging support defined, no filtering
[info] Skipping execution because packaging of this module is 'pom'.
[debug] Searching for versions in versionRange: (,46)
[info] Unable to find a previous version of the project in the repository.
[warn] No new version specified and file '/..../commons-parent/pom.xml' of artifact could not be opened as jar archive: error in opening zip file

java.util.zip.ZipException: error in opening zip file
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(ZipFile.java:225)
        at java.util.zip.ZipFile.<init>(ZipFile.java:155)
        at java.util.jar.JarFile.<init>(JarFile.java:166)
        at java.util.jar.JarFile.<init>(JarFile.java:130)
        at japicmp.maven.JApiCmpMojo.populateArchivesListsFromParameters(JApiCmpMojo.java:345)
        at japicmp.maven.JApiCmpMojo.getOptions(JApiCmpMojo.java:708)
        at japicmp.maven.JApiCmpReport.getOptions(JApiCmpReport.java:108)
        at japicmp.maven.JApiCmpReport.getDescription(JApiCmpReport.java:127)
        at org.apache.maven.plugins.site.render.CategorySummaryDocumentRenderer.renderDocument(CategorySummaryDocumentRenderer.java:155)




Changes in this version include:

New features:
o Add java-1.10 profile
o Add java-1.11 profile


Changes:
o japicmp-maven-plugin 0.11.0 -> 0.11.1
o maven-surefire-report-plugin 2.20.1 -> 2.21.0
o jacoco-maven-plugin 0.8.0 -> 0.8.1
o commons-build-plugin 1.7 -> 1.8
o commons-release-plugin 1.1 -> 1.2
o japicmp-maven-plugin: oldVersionPattern=\d+\.\d+\.\d*
o maven-assembly-plugin: 3.0.0 -> 3.1.0

Removed:
o Prerequisites tag; should only be used for maven-plugins, using maven-enforcer-plugin instead.


Historical list of changes: https://commons.apache.org/commons-parent-pom.html

For complete information on Apache Commons Parent, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons Parent website:

https://commons.apache.org/commons-parent-pom.html

-----------------------------------------------------------------------------

              Apache Commons Parent 45
                  RELEASE NOTES

The Apache Commons Parent team is pleased to announce the commons-parent-45 release!

The Apache Commons Parent POM provides common settings for all Apache Commons components.

Updates plugins and generally requires Java 7.


Changes in this version include:


Changes:
o Rearranging plugin order in -Prelease, removing commons-release-plugin from build>pluginManagement


Historical list of changes: https://commons.apache.org/commons-parent-pom.html

For complete information on Apache Commons Parent, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons Parent website:

https://commons.apache.org/commons-parent-pom.html

-----------------------------------------------------------------------------

              Apache Commons Parent 44
                  RELEASE NOTES

The Apache Commons Parent team is pleased to announce the release of Apache Commons Parent 44

The Apache Commons Parent POM provides common settings for all Apache Commons components.

Updates plugins and generally requires Java 7.

Notes on Building version 44.
-----------------------------
When building, because of an issue with japicmp, we have an erroneous non-failing stacktrace
that occurs. Specifically, we see:

[warn] No new version specified and file './commons-parent/pom.xml' of artifact could not be opened as
      jar archive: error in opening zip file
java.util.zip.ZipException: error in opening zip file

mainly caused by an error in
japicmp.maven.JApiCmpMojo.populateArchivesListsFromParameters(JApiCmpMojo.java:341).

We have asked for this to be addressed in the github issue: https://github.com/siom79/japicmp/issues/195

Changes in this version include:
--------------------------------
New features:
o new profile module-name to add 'Automatic-Module-Name' entry to the manifest
o COMMONSSITE-105: Add commons-release-plugin version 1.1
o COMMONSSITE-106: Add spotbugs-maven-plugin version 3.1.3


Changes:
o felix:maven-bundle-plugin 3.4.0 -> 3.5.0.
o build artifacts -test.jar, -sources.jar and -test-sources.jar always, not only at release time
o maven-enforcer-plugin set version to 3.0.0-M1 and update Maven requirement from 3.0.0 to 3.0.5 (the latest 3.0.x.)
o jacoco-maven-plugin 0.7.9 -> 0.8.0.
o Fix japicmp config: add to reporting section and define ignoreMissingNewVersion explicitly
o org.apache:apache 18 -> 19
o maven-surefire-plugin 2.20.1 -> 2.21.0
o maven-failsafe-plugin 2.20.1 -> 2.21.0


Historical list of changes: https://commons.apache.org/commons-parent-pom.html

For complete information on Apache Commons Parent, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons Parent website:

https://commons.apache.org/commons-parent-pom.html

-----------------------------------------------------------------------------

              Apache Commons Parent 43
                  RELEASE NOTES

The Apache Commons Parent team is pleased to announce the release of Apache Commons Parent 50

The Apache Commons Parent POM provides common settings for all Apache Commons components.

TBD

Changes in this version include:

Changes:
o site.xml: commons-skin 4.1 -> 4.2
o site.xml: Removed CDATA tag around the custom footer element
o commons.wagon-ssh.version 3.3.3 -> 3.3.4
o commons.assembly-plugin.version 3.1.1 -> 3.2.0
o commons.source-plugin.version 3.1.0 -> 3.2.0
o commons.jar-plugin.version 3.1.2 -> 3.2.0
o jacoco-maven-plugin 0.8.4 -> 0.8.5
o Move japicmp reporting section to the profile for opt-in behavior. Remove japicmp.skip flag used to skip the report.
o Disable jacoco non-aggregate reports.
o Update site build from Apache Commons BCEL 6.3.1 to 6.4.1.


Historical list of changes: https://commons.apache.org/commons-parent-pom.htmlchanges-report.html

For complete information on Apache Commons Parent, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons Parent website:

https://commons.apache.org/commons-parent-pom.html
