              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

Changes in this version include:

New features:
o                   Add property commons.dist.subdir. Thanks to Gary Gregory.
o                   Add github/codeql-action. Thanks to Gary Gregory.

Fixed Bugs:
o                   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.
o                   Fix minor typos #79. Thanks to Marc Wrobel.
o                   [StepSecurity] ci: Harden GitHub Actions #162. Thanks to step-security-bot, Gary Gregory.

Changes:
o                   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.
o                   Bump actions/cache. Thanks to Dependabot, Gary Gregory.
o                   Bump actions/checkout. Thanks to Dependabot, Gary Gregory.
o                   Bump actions/setup-java. Thanks to Gary Gregory, Dependabot.
o                   Bump actions/upload-artifact. Thanks to Dependabot.
o                   Bump github/codeql-action. Thanks to Dependabot.
o                   Bump maven-antrun-plugin from 1.8 to 3.1.0, #18, #71. Thanks to Dependabot.
o                   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.
o                   Bump spotbugs from 4.1.3 to 4.7.3, #24, #26, #57, #63, #72, #80, #98. Thanks to Gary Gregory, Dependabot.
o                   Bump maven-plugin-plugin from 3.6.0 to 3.9.0, #33, #52, #61, #104, #127, #138, #154. Thanks to Gary Gregory.
o                   Bump maven-plugin-tools-ant from 3.6.0 to 3.9.0, #32, #53, #59, #126, #139, #152. Thanks to Gary Gregory.
o                   Bump versions-maven-plugin from 2.9.0 to 2.15.0 #64, #74, #81, #101. #115, #119. #136. Thanks to Dependabot.
o                   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
