Apache Commons Build Plugin Maven Mojo 1.14.0 RELEASE NOTES
-----------------------------------------------------------

Apache Maven Mojo for Apache Commons Build tasks.

For example:
mvn commons-build:download-page [-Dcommons.release.version=1.2.3]

To use a SNAPSHOT version (for testing etc)
mvn org.apache.commons:commons-build-plugin:1.14.0-SNAPSHOT:download-page [-Dcommons.release.version=1.2.3]

Feature release

Changes in this version include:

New features
------------

*                   Add Maven property project.build.outputTimestamp for build reproducibility. Thanks to Gary Gregory.

Fixed Bugs
----------

*                   maven-plugin-report-plugin replaces maven-plugin-plugin report goal
*                   Fix up errors in GHA badges for Java and CodeQL
*                   Only use graalvm on Java11+; update to 22.3.3 which avoids NoClassDefFoundError messages
*                   Replace mail-archives.apache.org with lists.apache.org
*                   Drop mail archives that no longer exist (markmail, gmane, old.nabble)
*                   Disable moditect as it fails currently

Changes
-------

*                   Bump org.apache.maven.plugins:maven-plugin-plugin from 3.10.2 to 3.11.0 Thanks to Dependabot.
*                   Drop IRC references Thanks to Gary Gregory.
*                   Bump commons-parent from 58 to 69 #240. Thanks to Gary Gregory.
*                   Bump org.apache.ant:ant-launcher from 1.10.12 to 1.10.14. Thanks to Dependabot, Gary Gregory.
*                   Disable cyclonedx - not needed
*                   Drop outdated, unmaintained table of components in README in favour of link to website.
*                   Bump org.graalvm.js:js-scriptengine from 23.1.0 to 24.0.0 #236. Thanks to Dependabot.
*                   Bump org.graalvm.js:js from 23.0.1 to 23.0.3. Thanks to Dependabot.
*                   Bump org.apache.maven:maven-core 3.9.4 to 3.9.6. Thanks to Gary Gregory.
*                   Bump org.apache.maven:maven-plugin-api 3.9.4 to 3.9.6. Thanks to Gary Gregory.
*                   Bump org.apache.maven.plugin-tools:maven-script-ant 3.9.0 to 3.12.0 #241. Thanks to Gary Gregory.
*                   Bump org.apache.maven.plugin-tools:maven-plugin-tools-ant from 3.9.0 to 3.12.0 #242. Thanks to Gary Gregory.
*                   Bump org.apache.maven.plugins:maven-artifact-plugin from 3.5.0 to 3.5.1 #393. Thanks to Dependabot, Gary Gregory.


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

https://commons.apache.org/proper/commons-build-plugin/

Download page: https://commons.apache.org/proper/commons-build-plugin/download_codec.cgi

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

Apache Commons Build Plugin Maven Mojo 1.13 RELEASE NOTES
---------------------------------------------------------

Apache Maven Mojo for Apache Commons Build tasks.

For example:
mvn commons-build:download-page [-Dcommons.release.version=1.2.3]

To use a SNAPSHOT version (for testing etc)
mvn org.apache.commons:commons-build-plugin:1.13-SNAPSHOT:download-page [-Dcommons.release.version=1.2.3]

Feature release

New features
------------

*                   Add property commons.dist.subdir. Thanks to Gary Gregory.
*                   Add github/codeql-action. Thanks to Gary Gregory.

Fixed Bugs
----------

*                   Fix running on Java 11 and up. Use GraalVM instead of Java 8 Nashorn for JavaScript, which was deprecated in Java 11 and removed in Java 15.
                    Unfortunately, you will see this output on the console at the end of a successful build:
                    
                    Exception in thread "Thread-2" java.lang.NoClassDefFoundError: org/graalvm/collections/EconomicMapImpl$3
                    at org.graalvm.collections.EconomicMapImpl.iterator(EconomicMapImpl.java:846)
                    at com.oracle.truffle.polyglot.PolyglotEngineImpl.collectAliveContexts(PolyglotEngineImpl.java:1261)
                    at com.oracle.truffle.polyglot.PolyglotEngineImpl.ensureClosed(PolyglotEngineImpl.java:1158)
                    at com.oracle.truffle.polyglot.PolyglotEngineImpl$PolyglotShutDownHook.run(PolyglotEngineImpl.java:1407)
                    at java.lang.Thread.run(Thread.java:750)
                    Caused by: java.lang.ClassNotFoundException: org.graalvm.collections.EconomicMapImpl$3
                    at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)
                    at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:271)
                    at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:247)
                    at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239)
                    ... 5 more Thanks to Gary Gregory.
*                   Fix minor typos #79. Thanks to Marc Wrobel.
*                   [StepSecurity] ci: Harden GitHub Actions #162. Thanks to step-security-bot, Gary Gregory.

Changes
-------

*                   Bump Ant integration from org.apache.maven:maven-script-ant to org.apache.maven.plugin-tools:maven-script-ant 3.9.0. Thanks to Gary Gregory.
*                   Bump actions/cache. Thanks to Dependabot, Gary Gregory.
*                   Bump actions/checkout. Thanks to Dependabot, Gary Gregory.
*                   Bump actions/setup-java. Thanks to Gary Gregory, Dependabot.
*                   Bump actions/upload-artifact. Thanks to Dependabot.
*                   Bump github/codeql-action. Thanks to Dependabot.
*                   Bump maven-antrun-plugin from 1.8 to 3.1.0, #18, #71. Thanks to Dependabot.
*                   Bump spotbugs-maven-plugin from 4.1.3 to 4.7.3.0 #56, #58, #66, #73, #75, #77, #82, #93, #106. Thanks to Gary Gregory, Dependabot.
*                   Bump spotbugs from 4.1.3 to 4.7.3, #24, #26, #57, #63, #72, #80, #98. Thanks to Gary Gregory, Dependabot.
*                   Bump maven-plugin-plugin from 3.6.0 to 3.9.0, #33, #52, #61, #104, #127, #138, #154. Thanks to Gary Gregory.
*                   Bump maven-plugin-tools-ant from 3.6.0 to 3.9.0, #32, #53, #59, #126, #139, #152. Thanks to Gary Gregory.
*                   Bump versions-maven-plugin from 2.9.0 to 2.15.0 #64, #74, #81, #101. #115, #119. #136. Thanks to Dependabot.
*                   Bump commons-parent from 52 to 58 #67, #86, #110, #120, #153. Thanks to Dependabot, Gary Gregory.


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

https://commons.apache.org/proper/commons-build-plugin/

Download page: https://commons.apache.org/proper/commons-build-plugin/download_codec.cgi

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