             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
