Skip to content

Instantly share code, notes, and snippets.

@rebelwarrior
Created April 12, 2014 02:30
Show Gist options
  • Save rebelwarrior/10515710 to your computer and use it in GitHub Desktop.
Save rebelwarrior/10515710 to your computer and use it in GitHub Desktop.
jruby
#!/usr/bin/env bash
# -----------------------------------------------------------------------------
# jruby.bash - Start Script for the JRuby interpreter
#
# Environment Variable Prequisites
#
# JRUBY_OPTS (Optional) Default JRuby command line args
# JRUBY_SHELL Where/What is system shell
#
# JAVA_HOME Must point at your Java Development Kit installation.
#
# -----------------------------------------------------------------------------
cygwin=false
# ----- Identify OS we are running under --------------------------------------
case "`uname`" in
CYGWIN*) cygwin=true;;
Darwin) darwin=true;;
MINGW*) jruby.exe "$@"; exit $?;;
esac
# ----- Verify and Set Required Environment Variables -------------------------
if [ -z "$JAVA_VM" ]; then
JAVA_VM=-client
fi
# get the absolute path of the executable
SELF_PATH=$(builtin cd -P -- "$(dirname -- "$0")" >/dev/null && pwd -P) && SELF_PATH=$SELF_PATH/$(basename -- "$0")
# resolve symlinks
while [ -h $SELF_PATH ]; do
# 1) cd to directory of the symlink
# 2) cd to the directory of where the symlink points
# 3) get the pwd
# 4) append the basename
DIR=$(dirname -- "$SELF_PATH")
SYM=$(readlink $SELF_PATH)
SELF_PATH=$(cd $DIR && cd $(dirname -- "$SYM") && pwd)/$(basename -- "$SYM")
done
PRG=$SELF_PATH
JRUBY_HOME_1=`dirname "$PRG"` # the ./bin dir
if [ "$JRUBY_HOME_1" = '.' ] ; then
cwd=`pwd`
JRUBY_HOME=`dirname $cwd` # JRUBY-2699
else
JRUBY_HOME=`dirname "$JRUBY_HOME_1"` # the . dir
fi
if [ -z "$JRUBY_OPTS" ] ; then
JRUBY_OPTS=""
fi
JRUBY_OPTS_SPECIAL="--ng" # space-separated list of special flags
unset JRUBY_OPTS_TEMP
function process_special_opts {
case $1 in
--ng) nailgun_client=true;;
*) break;;
esac
}
for opt in ${JRUBY_OPTS[@]}; do
for special in ${JRUBY_OPTS_SPECIAL[@]}; do
if [ $opt != $special ]; then
JRUBY_OPTS_TEMP="${JRUBY_OPTS_TEMP} $opt"
else
# make sure flags listed in JRUBY_OPTS_SPECIAL are processed
case "$opt" in
--ng)
process_special_opts $opt;;
esac
fi
done
if [ $opt == "-server" ]; then # JRUBY-4204
JAVA_VM="-server"
fi
done
JRUBY_OPTS=${JRUBY_OPTS_TEMP}
if [ -z "$JAVACMD" ] ; then
if [ -z "$JAVA_HOME" ] ; then
JAVACMD='java'
else
if $cygwin; then
JAVACMD="`cygpath -u "$JAVA_HOME"`/bin/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
fi
fi
if [ -z "$JAVA_MEM" ] ; then
JAVA_MEM=-Xmx500m
fi
if [ -z "$JAVA_STACK" ] ; then
JAVA_STACK=-Xss2048k
fi
# process JAVA_OPTS
unset JAVA_OPTS_TEMP
JAVA_OPTS_TEMP=""
for opt in ${JAVA_OPTS[@]}; do
case $opt in
-server)
JAVA_VM="-server";;
-Xmx*)
JAVA_MEM=$opt;;
-Xms*)
JAVA_MEM_MIN=$opt;;
-Xss*)
JAVA_STACK=$opt;;
*)
JAVA_OPTS_TEMP="${JAVA_OPTS_TEMP} $opt";;
esac
done
JAVA_OPTS=$JAVA_OPTS_TEMP
# If you're seeing odd exceptions, you may have a bad JVM install.
# Uncomment this and report the version to the JRuby team along with error.
#$JAVACMD -version
JRUBY_SHELL=/bin/sh
# ----- Set Up The Boot Classpath -------------------------------------------
CP_DELIMITER=":"
# add main jruby jar to the bootclasspath
for j in "$JRUBY_HOME"/lib/jruby.jar "$JRUBY_HOME"/lib/jruby-complete.jar; do
if [ ! -e "$j" ]; then
continue
fi
if [ "$JRUBY_CP" ]; then
JRUBY_CP="$JRUBY_CP$CP_DELIMITER$j"
else
JRUBY_CP="$j"
fi
if [ $JRUBY_ALREADY_ADDED ]; then
echo "WARNING: more than one JRuby JAR found in lib directory"
fi
JRUBY_ALREADY_ADDED=true
done
if $cygwin; then
JRUBY_CP=`cygpath -p -w "$JRUBY_CP"`
fi
# ----- Set Up The System Classpath -------------------------------------------
if [ "$JRUBY_PARENT_CLASSPATH" != "" ]; then
# Use same classpath propagated from parent jruby
CP=$JRUBY_PARENT_CLASSPATH
else
# add other jars in lib to CP for command-line execution
for j in "$JRUBY_HOME"/lib/*.jar; do
if [ "$j" == "$JRUBY_HOME"/lib/jruby.jar ]; then
continue
fi
if [ "$j" == "$JRUBY_HOME"/lib/jruby-complete.jar ]; then
continue
fi
if [ "$CP" ]; then
CP="$CP$CP_DELIMITER$j"
else
CP="$j"
fi
done
if [ "$CP" != "" ] && $cygwin; then
CP=`cygpath -p -w "$CP"`
fi
fi
if $cygwin; then
# switch delimiter only after building Unix style classpaths
CP_DELIMITER=";"
fi
# ----- Execute The Requested Command -----------------------------------------
JAVA_ENCODING=""
declare -a java_args
declare -a ruby_args
mode=""
JAVA_CLASS_JRUBY_MAIN=org.jruby.Main
java_class=$JAVA_CLASS_JRUBY_MAIN
JAVA_CLASS_NGSERVER=com.martiansoftware.nailgun.NGServer
# Split out any -J argument for passing to the JVM.
# Scanning for args is aborted by '--'.
set -- $JRUBY_OPTS "$@"
while [ $# -gt 0 ]
do
case "$1" in
# Stuff after '-J' in this argument goes to JVM
-J*)
val=${1:2}
if [ "${val:0:4}" = "-Xmx" ]; then
JAVA_MEM=$val
elif [ "${val:0:4}" = "-Xms" ]; then
JAVA_MEM_MIN=$val
elif [ "${val:0:4}" = "-Xss" ]; then
JAVA_STACK=$val
elif [ "${val}" = "" ]; then
$JAVACMD -help
echo "(Prepend -J in front of these options when using 'jruby' command)"
exit
elif [ "${val}" = "-X" ]; then
$JAVACMD -X
echo "(Prepend -J in front of these options when using 'jruby' command)"
exit
elif [ "${val}" = "-classpath" ]; then
CP="$CP$CP_DELIMITER$2"
CLASSPATH=""
shift
elif [ "${val}" = "-cp" ]; then
CP="$CP$CP_DELIMITER$2"
CLASSPATH=""
shift
else
if [ "${val:0:3}" = "-ea" ]; then
VERIFY_JRUBY="yes"
elif [ "${val:0:16}" = "-Dfile.encoding=" ]; then
JAVA_ENCODING=$val
fi
java_args=("${java_args[@]}" "${1:2}")
fi
;;
# Match -Xa.b.c=d to translate to -Da.b.c=d as a java option
-X*)
val=${1:2}
if expr "$val" : '.*[.]' > /dev/null; then
java_args=("${java_args[@]}" "-Djruby.${val}")
else
ruby_args=("${ruby_args[@]}" "-X${val}")
fi
;;
# Match switches that take an argument
-C|-e|-I|-S) ruby_args=("${ruby_args[@]}" "$1" "$2"); shift ;;
# Match same switches with argument stuck together
-e*|-I*|-S*) ruby_args=("${ruby_args[@]}" "$1" ) ;;
# Run with JMX management enabled
--manage)
java_args=("${java_args[@]}" "-Dcom.sun.management.jmxremote")
java_args=("${java_args[@]}" "-Djruby.management.enabled=true") ;;
# Don't launch a GUI window, no matter what
--headless)
java_args=("${java_args[@]}" "-Djava.awt.headless=true") ;;
# Run under JDB
--jdb)
if [ -z "$JAVA_HOME" ] ; then
JAVACMD='jdb'
else
if $cygwin; then
JAVACMD="`cygpath -u "$JAVA_HOME"`/bin/jdb"
else
JAVACMD="$JAVA_HOME/bin/jdb"
fi
fi
java_args=("${java_args[@]}" "-sourcepath" "$JRUBY_HOME/lib/ruby/1.8:.")
JRUBY_OPTS=("${JRUBY_OPTS[@]}" "-X+C") ;;
--client)
JAVA_VM=-client ;;
--server)
JAVA_VM=-server ;;
--noclient) # JRUBY-4296
unset JAVA_VM ;; # For IBM JVM, neither '-client' nor '-server' is applicable
--sample)
java_args=("${java_args[@]}" "-Xprof") ;;
--ng-server)
# Start up as Nailgun server
java_class=$JAVA_CLASS_NGSERVER
VERIFY_JRUBY=true ;;
--ng)
# Use native Nailgun client to toss commands to server
process_special_opts "--ng" ;;
# Special pass --1.9 along so when processing cygwin we don't think it is
# a file (this is fairly gross that we special case this -- my bash-fu
# is weak)
--1.9) mode=--1.9 ;;
# Abort processing on the double dash
--) break ;;
# Other opts go to ruby
-*) ruby_args=("${ruby_args[@]}" "$1") ;;
# Abort processing on first non-opt arg
*) break ;;
esac
shift
done
# Force file.encoding to UTF-8 when on Mac, since Apple JDK defaults to MacRoman (JRUBY-3576)
if [[ $darwin && -z "$JAVA_ENCODING" ]]; then
java_args=("${java_args[@]}" "-Dfile.encoding=UTF-8")
fi
# Append the rest of the arguments
ruby_args=("${ruby_args[@]}" "$@")
# Put the ruby_args back into the position arguments $1, $2 etc
set -- "${ruby_args[@]}"
JAVA_OPTS="$JAVA_OPTS $JAVA_MEM $JAVA_MEM_MIN $JAVA_STACK"
JFFI_OPTS="-Djffi.boot.library.path=$JRUBY_HOME/lib/jni"
if $cygwin; then
JRUBY_HOME=`cygpath --mixed "$JRUBY_HOME"`
JRUBY_SHELL=`cygpath --mixed "$JRUBY_SHELL"`
if [[ ( "${1:0:1}" = "/" ) && ( ( -f "$1" ) || ( -d "$1" )) ]]; then
win_arg=`cygpath -w "$1"`
shift
win_args=("$win_arg" "$@")
set -- "${win_args[@]}"
fi
# fix JLine to use UnixTerminal
stty -icanon min 1 -echo > /dev/null 2>&1
if [ $? = 0 ]; then
JAVA_OPTS="$JAVA_OPTS -Djline.terminal=jline.UnixTerminal"
fi
fi
if [ "$nailgun_client" != "" ]; then
if [ -f $JRUBY_HOME/tool/nailgun/ng ]; then
exec $JRUBY_HOME/tool/nailgun/ng org.jruby.util.NailMain $mode "$@"
else
echo "error: ng executable not found; run 'make' in ${JRUBY_HOME}/tool/nailgun"
exit 1
fi
else
if [ "$VERIFY_JRUBY" != "" ]; then
if [ "$PROFILE_ARGS" != "" ]; then
echo "Running with instrumented profiler"
fi
if [[ "${java_class:-}" == "${JAVA_CLASS_NGSERVER:-}" && -n "${JRUBY_OPTS:-}" ]]; then
echo "warning: starting a nailgun server; discarding JRUBY_OPTS: ${JRUBY_OPTS}"
JRUBY_OPTS=''
fi
"$JAVACMD" $PROFILE_ARGS $JAVA_OPTS "$JFFI_OPTS" "${java_args[@]}" -classpath "$JRUBY_CP$CP_DELIMITER$CP$CP_DELIMITER$CLASSPATH" \
"-Djruby.home=$JRUBY_HOME" \
"-Djruby.lib=$JRUBY_HOME/lib" -Djruby.script=jruby \
"-Djruby.shell=$JRUBY_SHELL" \
$java_class $JRUBY_OPTS "$@"
# Record the exit status immediately, or it will be overridden.
JRUBY_STATUS=$?
if [ "$PROFILE_ARGS" != "" ]; then
echo "Profiling results:"
cat profile.txt
rm profile.txt
fi
if $cygwin; then
stty icanon echo > /dev/null 2>&1
fi
exit $JRUBY_STATUS
else
if $cygwin; then
# exec doed not work correctly with cygwin bash
"$JAVACMD" $JAVA_OPTS "$JFFI_OPTS" "${java_args[@]}" -Xbootclasspath/a:"$JRUBY_CP" -classpath "$CP$CP_DELIMITER$CLASSPATH" \
"-Djruby.home=$JRUBY_HOME" \
"-Djruby.lib=$JRUBY_HOME/lib" -Djruby.script=jruby \
"-Djruby.shell=$JRUBY_SHELL" \
$java_class $mode "$@"
# Record the exit status immediately, or it will be overridden.
JRUBY_STATUS=$?
stty icanon echo > /dev/null 2>&1
exit $JRUBY_STATUS
else
exec "$JAVACMD" $JAVA_OPTS "$JFFI_OPTS" "${java_args[@]}" -Xbootclasspath/a:"$JRUBY_CP" -classpath "$CP$CP_DELIMITER$CLASSPATH" \
"-Djruby.home=$JRUBY_HOME" \
"-Djruby.lib=$JRUBY_HOME/lib" -Djruby.script=jruby \
"-Djruby.shell=$JRUBY_SHELL" \
$java_class $mode "$@"
fi
fi
fi
# Be careful adding code down here, you might override the exit
# status of the jruby invocation.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment