From 217b8ae35294f780f3bf8dead74e3195033f564e Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 24 May 2026 16:41:39 +0300 Subject: [PATCH 1/2] Fix #5022: Eclipse jansi NPE; bump Maven wrapper to 3.9.9 The Eclipse "Debug Simulator" launch (and every other Maven-type launch shipped by the archetype) used m2e's M2_RUNTIME=EMBEDDED, which on older m2e bundles pulls in jansi 1.17.x. On JDK 16+ that jansi NPEs from AnsiConsole. -> getBoolean("jansi.passthrough") because the property is unset and the buggy implementation dereferences the null result. The JVM dies before Maven runs. - Inject jansi.passthrough / jansi.strip / jansi.force = false into the M2_PROPERTIES of every Maven-type .launch template so AnsiConsole's init reads non-null values regardless of the embedded jansi version. Same patch applied to the eclipse.zip the initializr serves. - Bump the Maven Wrapper to Apache 3.3.2 / Maven 3.9.9 (only-script, no jar) in the cn1app-archetype, the initializr's common.zip, and the cn1playground and hellocodenameone dev projects. Modern jansi (2.4.x) on the CLI side, no more Takari MavenWrapperDownloader.java, and broader exercise of the new wrapper across the repo. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../.mvn/wrapper/MavenWrapperDownloader.java | 117 ----- .../.mvn/wrapper/maven-wrapper.properties | 21 +- .../main/resources/archetype-resources/mvnw | 451 ++++++++--------- .../resources/archetype-resources/mvnw.cmd | 331 ++++++------- ...me__ - Build Android Studio Project.launch | 3 + ...inName__ - Build JavaSE Desktop App.launch | 3 + ...ainName__ - Build iOS Xcode Project.launch | 3 + .../__mainName__ - Debug Simulator.launch | 3 + .../eclipse/__mainName__ - Run Desktop.launch | 3 + .../__mainName__ - Run Simulator.launch | 3 + .../__mainName__ - Send Android Build.launch | 3 + ..._mainName__ - Send Javascript Build.launch | 3 + ...mainName__ - Send Mac Desktop Build.launch | 3 + ...Name__ - Send Windows Desktop Build.launch | 3 + ...mainName__ - Send Windows UWP Build.launch | 3 + ...__mainName__ - Send iOS Debug Build.launch | 3 + ...mainName__ - Send iOS Release Build.launch | 3 + .../__mainName__ - Update Codename One.launch | 6 +- .../eclipse/__mainName__ Settings.launch | 6 +- .../.mvn/wrapper/MavenWrapperDownloader.java | 117 ----- .../.mvn/wrapper/maven-wrapper.properties | 21 +- scripts/cn1playground/mvnw | 451 ++++++++--------- scripts/cn1playground/mvnw.cmd | 331 ++++++------- .../.mvn/wrapper/MavenWrapperDownloader.java | 117 ----- .../.mvn/wrapper/maven-wrapper.properties | 21 +- scripts/hellocodenameone/mvnw | 464 ++++++++---------- scripts/hellocodenameone/mvnw.cmd | 338 ++++++------- .../common/src/main/resources/common.zip | Bin 297174 -> 252251 bytes .../common/src/main/resources/eclipse.zip | Bin 11898 -> 12331 bytes 29 files changed, 1151 insertions(+), 1680 deletions(-) delete mode 100644 maven/cn1app-archetype/src/main/resources/archetype-resources/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 scripts/cn1playground/.mvn/wrapper/MavenWrapperDownloader.java mode change 100644 => 100755 scripts/cn1playground/mvnw delete mode 100644 scripts/hellocodenameone/.mvn/wrapper/MavenWrapperDownloader.java diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/.mvn/wrapper/MavenWrapperDownloader.java b/maven/cn1app-archetype/src/main/resources/archetype-resources/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index b901097f2d..0000000000 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2007-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - private static final String WRAPPER_VERSION = "0.5.6"; - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if(mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if(mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if(!outputFile.getParentFile().exists()) { - if(!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { - String username = System.getenv("MVNW_USERNAME"); - char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - } - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/.mvn/wrapper/maven-wrapper.properties b/maven/cn1app-archetype/src/main/resources/archetype-resources/.mvn/wrapper/maven-wrapper.properties index 642d572ce9..d58dfb70ba 100644 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/.mvn/wrapper/maven-wrapper.properties +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +1,19 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/mvnw b/maven/cn1app-archetype/src/main/resources/archetype-resources/mvnw index 41c0f0c23d..19529ddf8c 100755 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/mvnw +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/mvnw @@ -19,292 +19,241 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Maven Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir +# Apache Maven Wrapper startup batch script, version 3.3.2 # # Optional ENV vars # ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output # ---------------------------------------------------------------------------- -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac -fi +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 fi fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" +} - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" done + printf %x\\n $h +} - saveddir=`pwd` +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } - M2_HOME=`dirname "$PRG"`/.. +die() { + printf %s\\n "$1" >&2 + exit 1 +} - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" fi -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" fi -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" fi -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; fi -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" +clean || : +exec_maven "$@" diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/mvnw.cmd b/maven/cn1app-archetype/src/main/resources/archetype-resources/mvnw.cmd index 86115719e5..b150b91ed5 100644 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/mvnw.cmd +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/mvnw.cmd @@ -1,182 +1,149 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Build Android Studio Project.launch b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Build Android Studio Project.launch index cf583a463f..8efb6a5389 100644 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Build Android Studio Project.launch +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Build Android Studio Project.launch @@ -7,6 +7,9 @@ + + + diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Build JavaSE Desktop App.launch b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Build JavaSE Desktop App.launch index 0cd0764a8b..86c7b84a92 100644 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Build JavaSE Desktop App.launch +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Build JavaSE Desktop App.launch @@ -7,6 +7,9 @@ + + + diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Build iOS Xcode Project.launch b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Build iOS Xcode Project.launch index 151112f3ac..1e4e0dbc34 100644 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Build iOS Xcode Project.launch +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Build iOS Xcode Project.launch @@ -7,6 +7,9 @@ + + + diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Debug Simulator.launch b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Debug Simulator.launch index b36d4f0efc..caf0f113c0 100644 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Debug Simulator.launch +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Debug Simulator.launch @@ -7,6 +7,9 @@ + + + diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Run Desktop.launch b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Run Desktop.launch index 983709bec7..0bf22d143f 100644 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Run Desktop.launch +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Run Desktop.launch @@ -7,6 +7,9 @@ + + + diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Run Simulator.launch b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Run Simulator.launch index 41e0d022a5..7cf8fcb091 100644 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Run Simulator.launch +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Run Simulator.launch @@ -7,6 +7,9 @@ + + + diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Android Build.launch b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Android Build.launch index c458d55425..e1691765bf 100644 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Android Build.launch +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Android Build.launch @@ -7,6 +7,9 @@ + + + diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Javascript Build.launch b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Javascript Build.launch index a39094edd9..4b72d071cf 100644 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Javascript Build.launch +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Javascript Build.launch @@ -7,6 +7,9 @@ + + + diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Mac Desktop Build.launch b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Mac Desktop Build.launch index b9e370f054..055751eb4a 100644 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Mac Desktop Build.launch +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Mac Desktop Build.launch @@ -7,6 +7,9 @@ + + + diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Windows Desktop Build.launch b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Windows Desktop Build.launch index caa1d2b0f0..8cb5fd2e07 100644 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Windows Desktop Build.launch +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Windows Desktop Build.launch @@ -7,6 +7,9 @@ + + + diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Windows UWP Build.launch b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Windows UWP Build.launch index 275f539587..eea884d5af 100644 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Windows UWP Build.launch +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send Windows UWP Build.launch @@ -7,6 +7,9 @@ + + + diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send iOS Debug Build.launch b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send iOS Debug Build.launch index b72a51a9ac..84bba587f5 100644 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send iOS Debug Build.launch +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send iOS Debug Build.launch @@ -7,6 +7,9 @@ + + + diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send iOS Release Build.launch b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send iOS Release Build.launch index 659650a44a..5fd2e7b192 100644 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send iOS Release Build.launch +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Send iOS Release Build.launch @@ -7,6 +7,9 @@ + + + diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Update Codename One.launch b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Update Codename One.launch index 808bbca179..8bf56fadea 100644 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Update Codename One.launch +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ - Update Codename One.launch @@ -6,7 +6,11 @@ - + + + + + diff --git a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ Settings.launch b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ Settings.launch index fb2a9b0a3c..40138b7b86 100644 --- a/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ Settings.launch +++ b/maven/cn1app-archetype/src/main/resources/archetype-resources/tools/eclipse/__mainName__ Settings.launch @@ -6,7 +6,11 @@ - + + + + + diff --git a/scripts/cn1playground/.mvn/wrapper/MavenWrapperDownloader.java b/scripts/cn1playground/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index b901097f2d..0000000000 --- a/scripts/cn1playground/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2007-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - private static final String WRAPPER_VERSION = "0.5.6"; - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if(mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if(mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if(!outputFile.getParentFile().exists()) { - if(!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { - String username = System.getenv("MVNW_USERNAME"); - char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - } - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/scripts/cn1playground/.mvn/wrapper/maven-wrapper.properties b/scripts/cn1playground/.mvn/wrapper/maven-wrapper.properties index 642d572ce9..d58dfb70ba 100644 --- a/scripts/cn1playground/.mvn/wrapper/maven-wrapper.properties +++ b/scripts/cn1playground/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +1,19 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/scripts/cn1playground/mvnw b/scripts/cn1playground/mvnw old mode 100644 new mode 100755 index 41c0f0c23d..19529ddf8c --- a/scripts/cn1playground/mvnw +++ b/scripts/cn1playground/mvnw @@ -19,292 +19,241 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Maven Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir +# Apache Maven Wrapper startup batch script, version 3.3.2 # # Optional ENV vars # ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output # ---------------------------------------------------------------------------- -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac -fi +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 fi fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" +} - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" done + printf %x\\n $h +} - saveddir=`pwd` +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } - M2_HOME=`dirname "$PRG"`/.. +die() { + printf %s\\n "$1" >&2 + exit 1 +} - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" fi -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" fi -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" fi -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; fi -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" +clean || : +exec_maven "$@" diff --git a/scripts/cn1playground/mvnw.cmd b/scripts/cn1playground/mvnw.cmd index 86115719e5..b150b91ed5 100644 --- a/scripts/cn1playground/mvnw.cmd +++ b/scripts/cn1playground/mvnw.cmd @@ -1,182 +1,149 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/scripts/hellocodenameone/.mvn/wrapper/MavenWrapperDownloader.java b/scripts/hellocodenameone/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index b901097f2d..0000000000 --- a/scripts/hellocodenameone/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2007-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - private static final String WRAPPER_VERSION = "0.5.6"; - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if(mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if(mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if(!outputFile.getParentFile().exists()) { - if(!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { - String username = System.getenv("MVNW_USERNAME"); - char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - } - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/scripts/hellocodenameone/.mvn/wrapper/maven-wrapper.properties b/scripts/hellocodenameone/.mvn/wrapper/maven-wrapper.properties index 642d572ce9..d58dfb70ba 100644 --- a/scripts/hellocodenameone/.mvn/wrapper/maven-wrapper.properties +++ b/scripts/hellocodenameone/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +1,19 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/scripts/hellocodenameone/mvnw b/scripts/hellocodenameone/mvnw index b2a8f18832..19529ddf8c 100755 --- a/scripts/hellocodenameone/mvnw +++ b/scripts/hellocodenameone/mvnw @@ -19,309 +19,241 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Maven Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir +# Apache Maven Wrapper startup batch script, version 3.3.2 # # Optional ENV vars # ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output # ---------------------------------------------------------------------------- -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac -fi +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 fi fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -is_java17_home() { - if [ -z "$1" ] || [ ! -x "$1/bin/java" ]; then - return 1 + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi fi - "$1/bin/java" -version 2>&1 | head -n 1 | grep -q '"17' } -if ! is_java17_home "$JAVA_HOME" ; then - for candidate in /usr/lib/jvm/java-17-openjdk-amd64 /usr/lib/jvm/java-17-openjdk /usr/lib/jvm/jdk-17 /usr/lib/jvm/*17*; do - if is_java17_home "$candidate" ; then - JAVA_HOME="$candidate" - export JAVA_HOME - break - fi +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" done -fi + printf %x\\n $h +} -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` +die() { + printf %s\\n "$1" >&2 + exit 1 +} - M2_HOME=`dirname "$PRG"`/.. +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" fi -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" -fi +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" fi -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi +mkdir -p -- "${MAVEN_HOME%/*}" -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" fi -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; fi -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" +clean || : +exec_maven "$@" diff --git a/scripts/hellocodenameone/mvnw.cmd b/scripts/hellocodenameone/mvnw.cmd index b62efc0060..b150b91ed5 100644 --- a/scripts/hellocodenameone/mvnw.cmd +++ b/scripts/hellocodenameone/mvnw.cmd @@ -1,189 +1,149 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM Prefer JDK 17 when available because this project compiles with target 17. -if not "%JAVA_HOME%" == "" ( - "%JAVA_HOME%\bin\java.exe" -version 2>&1 | findstr /r /c:"version \"17\." /c:"version \"17\"" >nul -) -if errorlevel 1 if exist "C:\Program Files\Java\jdk-17\bin\java.exe" set "JAVA_HOME=C:\Program Files\Java\jdk-17" -if errorlevel 1 if exist "C:\Program Files\Eclipse Adoptium\jdk-17\bin\java.exe" set "JAVA_HOME=C:\Program Files\Eclipse Adoptium\jdk-17" - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/scripts/initializr/common/src/main/resources/common.zip b/scripts/initializr/common/src/main/resources/common.zip index a9de13ecf9b4a56464f9c8f63bea831ade7ae4cb..3b5771539371fdc86b53d95e2ae14428e656b168 100644 GIT binary patch delta 8007 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 delta 53086 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

By1fVVn15`LEttQB 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 CQ@)}A literal 11898 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 XKmGN{*DfAIT;LZcVBZ{c7k~O6?yek9 From f6b23820f5b8a6725936605decd5f4812f34e999 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 24 May 2026 17:48:31 +0300 Subject: [PATCH 2/2] Set JDK 17 for hellocodenameone Android build The old hellocodenameone/mvnw was a Takari wrapper hand-patched with an is_java17_home() probe that switched JAVA_HOME to a JDK 17 install when the inherited one wasn't 17. That hack was lost when this branch replaced mvnw with the canonical Apache wrapper, so the Android CI job fell back to the runner's JDK 8 and Maven's compiler died with "invalid target release: 17" against the project's 17. Mirror the pattern build-ios-app.sh already uses: wrap the mvnw call in a subshell that exports JAVA_HOME=JAVA17_HOME, and pass -Dmaven.compiler.fork=true / -Dmaven.compiler.executable as a belt-and-suspenders for any forked compile. Keeps the project's mvnw script identical to what new users get from the archetype. Co-Authored-By: Claude Opus 4.7 (1M context) --- scripts/build-android-app.sh | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/scripts/build-android-app.sh b/scripts/build-android-app.sh index aa20846a88..c26ef4fa39 100755 --- a/scripts/build-android-app.sh +++ b/scripts/build-android-app.sh @@ -81,12 +81,21 @@ APP_DIR="scripts/hellocodenameone" # --- Build Android gradle project --- ba_log "Building Android gradle project using Codename One port" cd $APP_DIR -xvfb-run -a ./mvnw package \ - -DskipTests \ - -Dcodename1.platform=android \ - -Dcodename1.buildTarget=android-source \ - -Dopen=false \ - -U -e +( + # hellocodenameone targets Java 17, so both the maven-compiler-plugin + # and any forked tooling need a 17 JDK. Mirrors what build-ios-app.sh + # does for the iOS pipeline. + export JAVA_HOME="$JAVA17_HOME" + export PATH="$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH" + xvfb-run -a ./mvnw package \ + -DskipTests \ + -Dcodename1.platform=android \ + -Dcodename1.buildTarget=android-source \ + -Dmaven.compiler.fork=true \ + -Dmaven.compiler.executable="$JAVA17_HOME/bin/javac" \ + -Dopen=false \ + -U -e +) cd ../.. GRADLE_PROJECT_DIR=$(find "$APP_DIR/android/target" -maxdepth 2 -type d -name "*-android-source" | head -n 1 || true)