Skip to content

jruby.bash includes current directory in classpath, should not #2783

Closed
@derek-upham

Description

@derek-upham

The jruby.bash script in jruby-1.7 and jruby-9.0.0.0 sticks the $CLASSPATH environment variable onto the end of the calculated -classpath argument $CP. The concatentation process happens whether or not $CLASSPATH exists:

-classpath "$CP$CP_DELIMITER$CLASSPATH"

This means if you don't specify a $CLASSPATH, -classpath ends up with a trailing colon:

lib/foo.jar:lib/bar.jar:

That trailing colon puts the process root directory into -classpath, whether or not you wanted it there. It's possible to work around this by setting $CLASSPATH to a non-existent file/directory:

env CLASSPATH=/dev/null/does/not/exist jruby.bash

but it seems more appropriate to not put the current directory into -classpath unless you explicitly request it:

env CLASSPATH=. jruby.bash
env CLASSPATH=$(pwd) jruby.bash

I have included a sample patch against jruby-1.7.11 which fixes the problem. It may also apply cleanly to the latest jruby-9.0.0.0 code.


diff --git a/jruby-1.7.11/bin/jruby.bash b/jruby-1.7.11/bin/jruby.bash
index 438d250..5cbecb0 100755
--- jruby-1.7.11/bin/jruby.bash
+++ jruby-1.7.11/bin/jruby.bash
@@ -309,6 +309,10 @@ JAVA_OPTS="$JAVA_OPTS $JAVA_MEM $JAVA_MEM_MIN $JAVA_STACK"

 JFFI_OPTS="-Djffi.boot.library.path=$JRUBY_HOME/lib/jni"

+if test -n "$CLASSPATH"; then
+    CP="$CP$CP_DELIMITER$CLASSPATH"
+fi
+
 if $cygwin; then
   JRUBY_HOME=`cygpath --mixed "$JRUBY_HOME"`
   JRUBY_SHELL=`cygpath --mixed "$JRUBY_SHELL"`
@@ -346,7 +350,7 @@ if [ "$VERIFY_JRUBY" != "" ]; then
     JRUBY_OPTS=''
   fi

-  "$JAVACMD" $PROFILE_ARGS $JAVA_OPTS "$JFFI_OPTS" "${java_args[@]}" -classpath "$JRUBY_CP$CP_DELIMITER$CP$CP_DELIMITER$CLASSPATH" \
+  "$JAVACMD" $PROFILE_ARGS $JAVA_OPTS "$JFFI_OPTS" "${java_args[@]}" -classpath "$JRUBY_CP$CP_DELIMITER$CP" \
     "-Djruby.home=$JRUBY_HOME" \
     "-Djruby.lib=$JRUBY_HOME/lib" -Djruby.script=jruby \
     "-Djruby.shell=$JRUBY_SHELL" \
@@ -369,7 +373,7 @@ if [ "$VERIFY_JRUBY" != "" ]; then
 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" \
+    "$JAVACMD" $JAVA_OPTS "$JFFI_OPTS" "${java_args[@]}" -Xbootclasspath/a:"$JRUBY_CP" -classpath "$CP" \
       "-Djruby.home=$JRUBY_HOME" \
       "-Djruby.lib=$JRUBY_HOME/lib" -Djruby.script=jruby \
       "-Djruby.shell=$JRUBY_SHELL" \
@@ -382,7 +386,7 @@ else

     exit $JRUBY_STATUS
   else
-    exec "$JAVACMD" $JAVA_OPTS "$JFFI_OPTS" "${java_args[@]}" -Xbootclasspath/a:"$JRUBY_CP" -classpath "$CP$CP_DELIMITER$CLASSPATH" \
+    exec "$JAVACMD" $JAVA_OPTS "$JFFI_OPTS" "${java_args[@]}" -Xbootclasspath/a:"$JRUBY_CP" -classpath "$CP" \
       "-Djruby.home=$JRUBY_HOME" \
       "-Djruby.lib=$JRUBY_HOME/lib" -Djruby.script=jruby \
       "-Djruby.shell=$JRUBY_SHELL" \

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions