1*27e8546dSMatt Gilbride#!/bin/sh 2*27e8546dSMatt Gilbride 3*27e8546dSMatt Gilbride# 4*27e8546dSMatt Gilbride# Copyright © 2015-2021 the original authors. 5*27e8546dSMatt Gilbride# 6*27e8546dSMatt Gilbride# Licensed under the Apache License, Version 2.0 (the "License"); 7*27e8546dSMatt Gilbride# you may not use this file except in compliance with the License. 8*27e8546dSMatt Gilbride# You may obtain a copy of the License at 9*27e8546dSMatt Gilbride# 10*27e8546dSMatt Gilbride# https://www.apache.org/licenses/LICENSE-2.0 11*27e8546dSMatt Gilbride# 12*27e8546dSMatt Gilbride# Unless required by applicable law or agreed to in writing, software 13*27e8546dSMatt Gilbride# distributed under the License is distributed on an "AS IS" BASIS, 14*27e8546dSMatt Gilbride# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15*27e8546dSMatt Gilbride# See the License for the specific language governing permissions and 16*27e8546dSMatt Gilbride# limitations under the License. 17*27e8546dSMatt Gilbride# 18*27e8546dSMatt Gilbride 19*27e8546dSMatt Gilbride############################################################################## 20*27e8546dSMatt Gilbride# 21*27e8546dSMatt Gilbride# Gradle start up script for POSIX generated by Gradle. 22*27e8546dSMatt Gilbride# 23*27e8546dSMatt Gilbride# Important for running: 24*27e8546dSMatt Gilbride# 25*27e8546dSMatt Gilbride# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is 26*27e8546dSMatt Gilbride# noncompliant, but you have some other compliant shell such as ksh or 27*27e8546dSMatt Gilbride# bash, then to run this script, type that shell name before the whole 28*27e8546dSMatt Gilbride# command line, like: 29*27e8546dSMatt Gilbride# 30*27e8546dSMatt Gilbride# ksh Gradle 31*27e8546dSMatt Gilbride# 32*27e8546dSMatt Gilbride# Busybox and similar reduced shells will NOT work, because this script 33*27e8546dSMatt Gilbride# requires all of these POSIX shell features: 34*27e8546dSMatt Gilbride# * functions; 35*27e8546dSMatt Gilbride# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», 36*27e8546dSMatt Gilbride# «${var#prefix}», «${var%suffix}», and «$( cmd )»; 37*27e8546dSMatt Gilbride# * compound commands having a testable exit status, especially «case»; 38*27e8546dSMatt Gilbride# * various built-in commands including «command», «set», and «ulimit». 39*27e8546dSMatt Gilbride# 40*27e8546dSMatt Gilbride# Important for patching: 41*27e8546dSMatt Gilbride# 42*27e8546dSMatt Gilbride# (2) This script targets any POSIX shell, so it avoids extensions provided 43*27e8546dSMatt Gilbride# by Bash, Ksh, etc; in particular arrays are avoided. 44*27e8546dSMatt Gilbride# 45*27e8546dSMatt Gilbride# The "traditional" practice of packing multiple parameters into a 46*27e8546dSMatt Gilbride# space-separated string is a well documented source of bugs and security 47*27e8546dSMatt Gilbride# problems, so this is (mostly) avoided, by progressively accumulating 48*27e8546dSMatt Gilbride# options in "$@", and eventually passing that to Java. 49*27e8546dSMatt Gilbride# 50*27e8546dSMatt Gilbride# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, 51*27e8546dSMatt Gilbride# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; 52*27e8546dSMatt Gilbride# see the in-line comments for details. 53*27e8546dSMatt Gilbride# 54*27e8546dSMatt Gilbride# There are tweaks for specific operating systems such as AIX, CygWin, 55*27e8546dSMatt Gilbride# Darwin, MinGW, and NonStop. 56*27e8546dSMatt Gilbride# 57*27e8546dSMatt Gilbride# (3) This script is generated from the Groovy template 58*27e8546dSMatt Gilbride# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt 59*27e8546dSMatt Gilbride# within the Gradle project. 60*27e8546dSMatt Gilbride# 61*27e8546dSMatt Gilbride# You can find Gradle at https://github.com/gradle/gradle/. 62*27e8546dSMatt Gilbride# 63*27e8546dSMatt Gilbride############################################################################## 64*27e8546dSMatt Gilbride 65*27e8546dSMatt Gilbride# Attempt to set APP_HOME 66*27e8546dSMatt Gilbride 67*27e8546dSMatt Gilbride# Resolve links: $0 may be a link 68*27e8546dSMatt Gilbrideapp_path=$0 69*27e8546dSMatt Gilbride 70*27e8546dSMatt Gilbride# Need this for daisy-chained symlinks. 71*27e8546dSMatt Gilbridewhile 72*27e8546dSMatt Gilbride APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path 73*27e8546dSMatt Gilbride [ -h "$app_path" ] 74*27e8546dSMatt Gilbridedo 75*27e8546dSMatt Gilbride ls=$( ls -ld "$app_path" ) 76*27e8546dSMatt Gilbride link=${ls#*' -> '} 77*27e8546dSMatt Gilbride case $link in #( 78*27e8546dSMatt Gilbride /*) app_path=$link ;; #( 79*27e8546dSMatt Gilbride *) app_path=$APP_HOME$link ;; 80*27e8546dSMatt Gilbride esac 81*27e8546dSMatt Gilbridedone 82*27e8546dSMatt Gilbride 83*27e8546dSMatt GilbrideAPP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit 84*27e8546dSMatt Gilbride 85*27e8546dSMatt GilbrideAPP_NAME="Gradle" 86*27e8546dSMatt GilbrideAPP_BASE_NAME=${0##*/} 87*27e8546dSMatt Gilbride 88*27e8546dSMatt Gilbride# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 89*27e8546dSMatt GilbrideDEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 90*27e8546dSMatt Gilbride 91*27e8546dSMatt Gilbride# Use the maximum available, or set MAX_FD != -1 to use that value. 92*27e8546dSMatt GilbrideMAX_FD=maximum 93*27e8546dSMatt Gilbride 94*27e8546dSMatt Gilbridewarn () { 95*27e8546dSMatt Gilbride echo "$*" 96*27e8546dSMatt Gilbride} >&2 97*27e8546dSMatt Gilbride 98*27e8546dSMatt Gilbridedie () { 99*27e8546dSMatt Gilbride echo 100*27e8546dSMatt Gilbride echo "$*" 101*27e8546dSMatt Gilbride echo 102*27e8546dSMatt Gilbride exit 1 103*27e8546dSMatt Gilbride} >&2 104*27e8546dSMatt Gilbride 105*27e8546dSMatt Gilbride# OS specific support (must be 'true' or 'false'). 106*27e8546dSMatt Gilbridecygwin=false 107*27e8546dSMatt Gilbridemsys=false 108*27e8546dSMatt Gilbridedarwin=false 109*27e8546dSMatt Gilbridenonstop=false 110*27e8546dSMatt Gilbridecase "$( uname )" in #( 111*27e8546dSMatt Gilbride CYGWIN* ) cygwin=true ;; #( 112*27e8546dSMatt Gilbride Darwin* ) darwin=true ;; #( 113*27e8546dSMatt Gilbride MSYS* | MINGW* ) msys=true ;; #( 114*27e8546dSMatt Gilbride NONSTOP* ) nonstop=true ;; 115*27e8546dSMatt Gilbrideesac 116*27e8546dSMatt Gilbride 117*27e8546dSMatt GilbrideCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 118*27e8546dSMatt Gilbride 119*27e8546dSMatt Gilbride 120*27e8546dSMatt Gilbride# Determine the Java command to use to start the JVM. 121*27e8546dSMatt Gilbrideif [ -n "$JAVA_HOME" ] ; then 122*27e8546dSMatt Gilbride if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 123*27e8546dSMatt Gilbride # IBM's JDK on AIX uses strange locations for the executables 124*27e8546dSMatt Gilbride JAVACMD=$JAVA_HOME/jre/sh/java 125*27e8546dSMatt Gilbride else 126*27e8546dSMatt Gilbride JAVACMD=$JAVA_HOME/bin/java 127*27e8546dSMatt Gilbride fi 128*27e8546dSMatt Gilbride if [ ! -x "$JAVACMD" ] ; then 129*27e8546dSMatt Gilbride die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 130*27e8546dSMatt Gilbride 131*27e8546dSMatt GilbridePlease set the JAVA_HOME variable in your environment to match the 132*27e8546dSMatt Gilbridelocation of your Java installation." 133*27e8546dSMatt Gilbride fi 134*27e8546dSMatt Gilbrideelse 135*27e8546dSMatt Gilbride JAVACMD=java 136*27e8546dSMatt Gilbride which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 137*27e8546dSMatt Gilbride 138*27e8546dSMatt GilbridePlease set the JAVA_HOME variable in your environment to match the 139*27e8546dSMatt Gilbridelocation of your Java installation." 140*27e8546dSMatt Gilbridefi 141*27e8546dSMatt Gilbride 142*27e8546dSMatt Gilbride# Increase the maximum file descriptors if we can. 143*27e8546dSMatt Gilbrideif ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then 144*27e8546dSMatt Gilbride case $MAX_FD in #( 145*27e8546dSMatt Gilbride max*) 146*27e8546dSMatt Gilbride MAX_FD=$( ulimit -H -n ) || 147*27e8546dSMatt Gilbride warn "Could not query maximum file descriptor limit" 148*27e8546dSMatt Gilbride esac 149*27e8546dSMatt Gilbride case $MAX_FD in #( 150*27e8546dSMatt Gilbride '' | soft) :;; #( 151*27e8546dSMatt Gilbride *) 152*27e8546dSMatt Gilbride ulimit -n "$MAX_FD" || 153*27e8546dSMatt Gilbride warn "Could not set maximum file descriptor limit to $MAX_FD" 154*27e8546dSMatt Gilbride esac 155*27e8546dSMatt Gilbridefi 156*27e8546dSMatt Gilbride 157*27e8546dSMatt Gilbride# Collect all arguments for the java command, stacking in reverse order: 158*27e8546dSMatt Gilbride# * args from the command line 159*27e8546dSMatt Gilbride# * the main class name 160*27e8546dSMatt Gilbride# * -classpath 161*27e8546dSMatt Gilbride# * -D...appname settings 162*27e8546dSMatt Gilbride# * --module-path (only if needed) 163*27e8546dSMatt Gilbride# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. 164*27e8546dSMatt Gilbride 165*27e8546dSMatt Gilbride# For Cygwin or MSYS, switch paths to Windows format before running java 166*27e8546dSMatt Gilbrideif "$cygwin" || "$msys" ; then 167*27e8546dSMatt Gilbride APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) 168*27e8546dSMatt Gilbride CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) 169*27e8546dSMatt Gilbride 170*27e8546dSMatt Gilbride JAVACMD=$( cygpath --unix "$JAVACMD" ) 171*27e8546dSMatt Gilbride 172*27e8546dSMatt Gilbride # Now convert the arguments - kludge to limit ourselves to /bin/sh 173*27e8546dSMatt Gilbride for arg do 174*27e8546dSMatt Gilbride if 175*27e8546dSMatt Gilbride case $arg in #( 176*27e8546dSMatt Gilbride -*) false ;; # don't mess with options #( 177*27e8546dSMatt Gilbride /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath 178*27e8546dSMatt Gilbride [ -e "$t" ] ;; #( 179*27e8546dSMatt Gilbride *) false ;; 180*27e8546dSMatt Gilbride esac 181*27e8546dSMatt Gilbride then 182*27e8546dSMatt Gilbride arg=$( cygpath --path --ignore --mixed "$arg" ) 183*27e8546dSMatt Gilbride fi 184*27e8546dSMatt Gilbride # Roll the args list around exactly as many times as the number of 185*27e8546dSMatt Gilbride # args, so each arg winds up back in the position where it started, but 186*27e8546dSMatt Gilbride # possibly modified. 187*27e8546dSMatt Gilbride # 188*27e8546dSMatt Gilbride # NB: a `for` loop captures its iteration list before it begins, so 189*27e8546dSMatt Gilbride # changing the positional parameters here affects neither the number of 190*27e8546dSMatt Gilbride # iterations, nor the values presented in `arg`. 191*27e8546dSMatt Gilbride shift # remove old arg 192*27e8546dSMatt Gilbride set -- "$@" "$arg" # push replacement arg 193*27e8546dSMatt Gilbride done 194*27e8546dSMatt Gilbridefi 195*27e8546dSMatt Gilbride 196*27e8546dSMatt Gilbride# Collect all arguments for the java command; 197*27e8546dSMatt Gilbride# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of 198*27e8546dSMatt Gilbride# shell script including quotes and variable substitutions, so put them in 199*27e8546dSMatt Gilbride# double quotes to make sure that they get re-expanded; and 200*27e8546dSMatt Gilbride# * put everything else in single quotes, so that it's not re-expanded. 201*27e8546dSMatt Gilbride 202*27e8546dSMatt Gilbrideset -- \ 203*27e8546dSMatt Gilbride "-Dorg.gradle.appname=$APP_BASE_NAME" \ 204*27e8546dSMatt Gilbride -classpath "$CLASSPATH" \ 205*27e8546dSMatt Gilbride org.gradle.wrapper.GradleWrapperMain \ 206*27e8546dSMatt Gilbride "$@" 207*27e8546dSMatt Gilbride 208*27e8546dSMatt Gilbride# Use "xargs" to parse quoted args. 209*27e8546dSMatt Gilbride# 210*27e8546dSMatt Gilbride# With -n1 it outputs one arg per line, with the quotes and backslashes removed. 211*27e8546dSMatt Gilbride# 212*27e8546dSMatt Gilbride# In Bash we could simply go: 213*27e8546dSMatt Gilbride# 214*27e8546dSMatt Gilbride# readarray ARGS < <( xargs -n1 <<<"$var" ) && 215*27e8546dSMatt Gilbride# set -- "${ARGS[@]}" "$@" 216*27e8546dSMatt Gilbride# 217*27e8546dSMatt Gilbride# but POSIX shell has neither arrays nor command substitution, so instead we 218*27e8546dSMatt Gilbride# post-process each arg (as a line of input to sed) to backslash-escape any 219*27e8546dSMatt Gilbride# character that might be a shell metacharacter, then use eval to reverse 220*27e8546dSMatt Gilbride# that process (while maintaining the separation between arguments), and wrap 221*27e8546dSMatt Gilbride# the whole thing up as a single "set" statement. 222*27e8546dSMatt Gilbride# 223*27e8546dSMatt Gilbride# This will of course break if any of these variables contains a newline or 224*27e8546dSMatt Gilbride# an unmatched quote. 225*27e8546dSMatt Gilbride# 226*27e8546dSMatt Gilbride 227*27e8546dSMatt Gilbrideeval "set -- $( 228*27e8546dSMatt Gilbride printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | 229*27e8546dSMatt Gilbride xargs -n1 | 230*27e8546dSMatt Gilbride sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | 231*27e8546dSMatt Gilbride tr '\n' ' ' 232*27e8546dSMatt Gilbride )" '"$@"' 233*27e8546dSMatt Gilbride 234*27e8546dSMatt Gilbrideexec "$JAVACMD" "$@" 235