@@ -289,7 +289,64 @@ ARGS=(
289289 " ${ARGS[@]} " )
290290
291291
292+ function run_test_with_large_classpath() {
293+ if [ " %use_argument_file_in_runner_for_improved_performance%" == " True" ]; then
294+ run_test_with_argument_file " $1 "
295+ else
296+ create_and_run_classpath_jar " $2 "
297+ fi
298+ }
299+
292300function create_and_run_classpath_jar() {
301+ # Build class path as one single string separated by spaces
302+ MANIFEST_CLASSPATH=" "
303+ if is_windows; then
304+ CLASSPATH_SEPARATOR=" ;"
305+ URI_PREFIX=" file:/" # e.g. "file:/C:/temp/foo.jar"
306+ else
307+ CLASSPATH_SEPARATOR=" :"
308+ URI_PREFIX=" file:$( pwd) /" # e.g. "file:/usr/local/foo.jar"
309+ fi
310+
311+ URI_PREFIX=${URI_PREFIX// \/ / \\ / }
312+ MANIFEST_CLASSPATH=" ${CLASSPATH_SEPARATOR}${CLASSPATH} "
313+
314+ MANIFEST_CLASSPATH=$( sed " s/ /%20/g" <<< " ${MANIFEST_CLASSPATH}" )
315+ MANIFEST_CLASSPATH=$( sed " s/$CLASSPATH_SEPARATOR / $URI_PREFIX /g" <<< " ${MANIFEST_CLASSPATH}" )
316+
317+ # Create manifest file
318+ MANIFEST_FILE=" $( mktemp -t XXXXXXXX.jar_manifest) "
319+
320+ (
321+ echo " Manifest-Version: 1.0"
322+
323+ CLASSPATH_LINE=" Class-Path:$MANIFEST_CLASSPATH "
324+ # No line in the MANIFEST.MF file may be longer than 72 bytes.
325+ # A space prefix indicates the line is still the content of the last attribute.
326+ CLASSPATH_MANIFEST_LINES=$( sed -E $' s/(.{71})/\\ 1\\\n /g' <<< " ${CLASSPATH_LINE}" )
327+ echo " $CLASSPATH_MANIFEST_LINES "
328+ echo " Created-By: Bazel"
329+ ) > $MANIFEST_FILE
330+
331+ # Create classpath JAR file
332+ MANIFEST_JAR_FILE=" $( mktemp -t XXXXXXXX-classpath.jar) "
333+ if is_windows; then
334+ MANIFEST_JAR_FILE=" $( cygpath --windows " $MANIFEST_JAR_FILE " ) "
335+ MANIFEST_FILE=" $( cygpath --windows " $MANIFEST_FILE " ) "
336+ fi
337+ JARBIN=" ${JARBIN:- $(rlocation " $1 " )} "
338+ $JARBIN cvfm " $MANIFEST_JAR_FILE " " $MANIFEST_FILE " > /dev/null || \
339+ die " ERROR: $self failed because $JARBIN failed"
340+
341+ # Execute JAVA command
342+ $JAVABIN -classpath " $MANIFEST_JAR_FILE " " ${ARGS[@]} "
343+ exit_code=$?
344+ rm -f " $MANIFEST_FILE "
345+ rm -f " $MANIFEST_JAR_FILE "
346+ exit $exit_code
347+ }
348+
349+ function run_test_with_argument_file() {
293350 ARGS_FILE=" $( mktemp -t XXXXXXXX.args) "
294351 echo " -cp " $CLASSPATH >> $ARGS_FILE
295352 $JAVABIN @$ARGS_FILE " ${ARGS[@]} "
317374# Difference ends
318375
319376if is_windows && (( "${# CLASSPATH} " > ${CLASSPATH_LIMIT} )) ; then
320- create_and_run_classpath_jar " ${JARBIN} .exe"
377+ run_test_with_large_classpath " ${JARBIN} .exe"
321378elif (( "${# CLASSPATH} " > ${CLASSPATH_LIMIT} )) ; then
322- create_and_run_classpath_jar " $JARBIN "
379+ run_test_with_large_classpath " $JARBIN "
323380else
324381 exec $JAVABIN -classpath $CLASSPATH " ${ARGS[@]} "
325382fi
0 commit comments