              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


Have fun!
-Apache Commons Parent team

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

              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 43

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 maven-compiler-plugin 3.6.1 -> 3.6.2.
o maven-compiler-plugin 3.6.2 -> 3.7.0.
o jacoco-maven-plugin 0.7.7.201606060606 -> 0.7.9.
o maven-javadoc-plugin 2.10.4 -> 3.0.0 (Java 9 compatibility.)
o Update japicmp 0.9.3 -> 0.10.0.
o animal-sniffer-maven-plugin 1.15 -> 1.16.
o commons.findbugs.version 3.0.3 -> 3.0.5 (requires Java 7.)
o commons.clirr.version 2.7 -> 2.8.
o maven-surefire-plugin 2.19.1 -> 2.20.1.
o Add maven-failsafe-plugin 2.20.1 (to along with surefire.)
o felix:maven-bundle-plugin 3.0.1 -> 3.4.0 (requires Java 7.
o versions-maven-plugin 2.3 -> 2.5.
o japicmp-maven-plugin 0.10.0 -> 0.11.0.
o build-helper-maven-plugin 1.10 -> 3.0.0 (requires Maven 3 and Java 7.)
o wagon-ssh 2.10 -> 3.0.0.
o maven-site-plugin 3.6 -> 3.7 (fixes Java 9 builds; for migrating from 3.4 to 3.5.1, see https://maven.apache.org/components/plugins/maven-site-plugin/migrate.html)


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 42
                  RELEASE NOTES

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

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

Changes in this version include:

New features:
o new profiles to run coveralls coverage
  reports via Travis using Jacoco or Cobertura respectively

Changes:
o maven-site-plugin 3.4 -> 3.6 (for migrating from 3.4 to 3.5.1, see https://maven.apache.org/components/plugins/maven-site-plugin/migrate.html)
o jacoco-maven-plugin : 0.7.6.201602180812 -> 0.7.7.201606060606
o commons-build-plugin : 1.6 -> 1.7
o maven-changes-plugin : 2.12 -> 2.12.1
o Update japicmp: 0.8.0 -> 0.9.1
o maven-compiler-plugin : 3.5.1 -> 3.6.0
o japicmp plugin no longer fail on "mvn site" (it requires target/*jar), use "mvn package site -Pjapicmp" to include its report
o japicmp-maven-plugin : 0.8.0 -> 0.9.3
o new property
  commons.japicmp.breakBuildOnBinaryIncompatibleModifications
  controls the breakBuildOnBinaryIncompatibleModifications
  setting of japicmp


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

