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