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

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

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

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

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