              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: http://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:

http://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: http://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:

http://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: http://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:

http://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: http://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:

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