1#!/bin/sh 2# ---------------------------------------------------------------------------- 3# Licensed to the Apache Software Foundation (ASF) under one 4# or more contributor license agreements. See the NOTICE file 5# distributed with this work for additional information 6# regarding copyright ownership. The ASF licenses this file 7# to you under the Apache License, Version 2.0 (the 8# "License"); you may not use this file except in compliance 9# with the License. You may obtain a copy of the License at 10# 11# http://www.apache.org/licenses/LICENSE-2.0 12# 13# Unless required by applicable law or agreed to in writing, 14# software distributed under the License is distributed on an 15# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16# KIND, either express or implied. See the License for the 17# specific language governing permissions and limitations 18# under the License. 19# ---------------------------------------------------------------------------- 20 21# ---------------------------------------------------------------------------- 22# Apache Maven Wrapper startup batch script, version 3.2.0 23# 24# Required ENV vars: 25# ------------------ 26# JAVA_HOME - location of a JDK home dir 27# 28# Optional ENV vars 29# ----------------- 30# MAVEN_OPTS - parameters passed to the Java VM when running Maven 31# e.g. to debug Maven itself, use 32# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33# MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34# ---------------------------------------------------------------------------- 35 36if [ -z "$MAVEN_SKIP_RC" ] ; then 37 38 if [ -f /usr/local/etc/mavenrc ] ; then 39 . /usr/local/etc/mavenrc 40 fi 41 42 if [ -f /etc/mavenrc ] ; then 43 . /etc/mavenrc 44 fi 45 46 if [ -f "$HOME/.mavenrc" ] ; then 47 . "$HOME/.mavenrc" 48 fi 49 50fi 51 52# OS specific support. $var _must_ be set to either true or false. 53cygwin=false; 54darwin=false; 55mingw=false 56case "$(uname)" in 57 CYGWIN*) cygwin=true ;; 58 MINGW*) mingw=true;; 59 Darwin*) darwin=true 60 # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home 61 # See https://developer.apple.com/library/mac/qa/qa1170/_index.html 62 if [ -z "$JAVA_HOME" ]; then 63 if [ -x "/usr/libexec/java_home" ]; then 64 JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME 65 else 66 JAVA_HOME="/Library/Java/Home"; export JAVA_HOME 67 fi 68 fi 69 ;; 70esac 71 72if [ -z "$JAVA_HOME" ] ; then 73 if [ -r /etc/gentoo-release ] ; then 74 JAVA_HOME=$(java-config --jre-home) 75 fi 76fi 77 78# For Cygwin, ensure paths are in UNIX format before anything is touched 79if $cygwin ; then 80 [ -n "$JAVA_HOME" ] && 81 JAVA_HOME=$(cygpath --unix "$JAVA_HOME") 82 [ -n "$CLASSPATH" ] && 83 CLASSPATH=$(cygpath --path --unix "$CLASSPATH") 84fi 85 86# For Mingw, ensure paths are in UNIX format before anything is touched 87if $mingw ; then 88 [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && 89 JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" 90fi 91 92if [ -z "$JAVA_HOME" ]; then 93 javaExecutable="$(which javac)" 94 if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then 95 # readlink(1) is not available as standard on Solaris 10. 96 readLink=$(which readlink) 97 if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then 98 if $darwin ; then 99 javaHome="$(dirname "\"$javaExecutable\"")" 100 javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" 101 else 102 javaExecutable="$(readlink -f "\"$javaExecutable\"")" 103 fi 104 javaHome="$(dirname "\"$javaExecutable\"")" 105 javaHome=$(expr "$javaHome" : '\(.*\)/bin') 106 JAVA_HOME="$javaHome" 107 export JAVA_HOME 108 fi 109 fi 110fi 111 112if [ -z "$JAVACMD" ] ; then 113 if [ -n "$JAVA_HOME" ] ; then 114 if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 115 # IBM's JDK on AIX uses strange locations for the executables 116 JAVACMD="$JAVA_HOME/jre/sh/java" 117 else 118 JAVACMD="$JAVA_HOME/bin/java" 119 fi 120 else 121 JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" 122 fi 123fi 124 125if [ ! -x "$JAVACMD" ] ; then 126 echo "Error: JAVA_HOME is not defined correctly." >&2 127 echo " We cannot execute $JAVACMD" >&2 128 exit 1 129fi 130 131if [ -z "$JAVA_HOME" ] ; then 132 echo "Warning: JAVA_HOME environment variable is not set." 133fi 134 135# traverses directory structure from process work directory to filesystem root 136# first directory with .mvn subdirectory is considered project base directory 137find_maven_basedir() { 138 if [ -z "$1" ] 139 then 140 echo "Path not specified to find_maven_basedir" 141 return 1 142 fi 143 144 basedir="$1" 145 wdir="$1" 146 while [ "$wdir" != '/' ] ; do 147 if [ -d "$wdir"/.mvn ] ; then 148 basedir=$wdir 149 break 150 fi 151 # workaround for JBEAP-8937 (on Solaris 10/Sparc) 152 if [ -d "${wdir}" ]; then 153 wdir=$(cd "$wdir/.." || exit 1; pwd) 154 fi 155 # end of workaround 156 done 157 printf '%s' "$(cd "$basedir" || exit 1; pwd)" 158} 159 160# concatenates all lines of a file 161concat_lines() { 162 if [ -f "$1" ]; then 163 # Remove \r in case we run on Windows within Git Bash 164 # and check out the repository with auto CRLF management 165 # enabled. Otherwise, we may read lines that are delimited with 166 # \r\n and produce $'-Xarg\r' rather than -Xarg due to word 167 # splitting rules. 168 tr -s '\r\n' ' ' < "$1" 169 fi 170} 171 172log() { 173 if [ "$MVNW_VERBOSE" = true ]; then 174 printf '%s\n' "$1" 175 fi 176} 177 178BASE_DIR=$(find_maven_basedir "$(dirname "$0")") 179if [ -z "$BASE_DIR" ]; then 180 exit 1; 181fi 182 183MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR 184log "$MAVEN_PROJECTBASEDIR" 185 186########################################################################################## 187# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 188# This allows using the maven wrapper in projects that prohibit checking in binary data. 189########################################################################################## 190wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" 191if [ -r "$wrapperJarPath" ]; then 192 log "Found $wrapperJarPath" 193else 194 log "Couldn't find $wrapperJarPath, downloading it ..." 195 196 if [ -n "$MVNW_REPOURL" ]; then 197 wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" 198 else 199 wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" 200 fi 201 while IFS="=" read -r key value; do 202 # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) 203 safeValue=$(echo "$value" | tr -d '\r') 204 case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; 205 esac 206 done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" 207 log "Downloading from: $wrapperUrl" 208 209 if $cygwin; then 210 wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") 211 fi 212 213 if command -v wget > /dev/null; then 214 log "Found wget ... using wget" 215 [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" 216 if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then 217 wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" 218 else 219 wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" 220 fi 221 elif command -v curl > /dev/null; then 222 log "Found curl ... using curl" 223 [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" 224 if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then 225 curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" 226 else 227 curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" 228 fi 229 else 230 log "Falling back to using Java to download" 231 javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" 232 javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" 233 # For Cygwin, switch paths to Windows format before running javac 234 if $cygwin; then 235 javaSource=$(cygpath --path --windows "$javaSource") 236 javaClass=$(cygpath --path --windows "$javaClass") 237 fi 238 if [ -e "$javaSource" ]; then 239 if [ ! -e "$javaClass" ]; then 240 log " - Compiling MavenWrapperDownloader.java ..." 241 ("$JAVA_HOME/bin/javac" "$javaSource") 242 fi 243 if [ -e "$javaClass" ]; then 244 log " - Running MavenWrapperDownloader.java ..." 245 ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" 246 fi 247 fi 248 fi 249fi 250########################################################################################## 251# End of extension 252########################################################################################## 253 254# If specified, validate the SHA-256 sum of the Maven wrapper jar file 255wrapperSha256Sum="" 256while IFS="=" read -r key value; do 257 case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; 258 esac 259done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" 260if [ -n "$wrapperSha256Sum" ]; then 261 wrapperSha256Result=false 262 if command -v sha256sum > /dev/null; then 263 if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then 264 wrapperSha256Result=true 265 fi 266 elif command -v shasum > /dev/null; then 267 if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then 268 wrapperSha256Result=true 269 fi 270 else 271 echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." 272 echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." 273 exit 1 274 fi 275 if [ $wrapperSha256Result = false ]; then 276 echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 277 echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 278 echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 279 exit 1 280 fi 281fi 282 283MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" 284 285# For Cygwin, switch paths to Windows format before running java 286if $cygwin; then 287 [ -n "$JAVA_HOME" ] && 288 JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") 289 [ -n "$CLASSPATH" ] && 290 CLASSPATH=$(cygpath --path --windows "$CLASSPATH") 291 [ -n "$MAVEN_PROJECTBASEDIR" ] && 292 MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") 293fi 294 295# Provide a "standardized" way to retrieve the CLI args that will 296# work with both Windows and non-Windows executions. 297MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" 298export MAVEN_CMD_LINE_ARGS 299 300WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 301 302# shellcheck disable=SC2086 # safe args 303exec "$JAVACMD" \ 304 $MAVEN_OPTS \ 305 $MAVEN_DEBUG_OPTS \ 306 -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ 307 "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ 308 ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" 309