aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
authorGravatar Yun Peng <pcloudy@google.com>2017-01-25 15:05:14 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2017-01-25 22:23:11 +0000
commit752b61ee4d839b6b9680353c0d1d02de2ad13f14 (patch)
tree0440e4926cee2c9357f18211ebafb145d36e528b /src/main/java
parent389c2b65d4aea0a2e8649bd77d8f4200a485da1f (diff)
java_stub_template: Create classpath jar when classpath is too long
Fixed https://github.com/bazelbuild/bazel/issues/2242 -- Change-Id: I3a011c2575f47233091e8f5b87df6372a3438bdd Reviewed-on: https://cr.bazel.build/8470 PiperOrigin-RevId: 145543780 MOS_MIGRATED_REVID=145543780
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/java/java_stub_template.txt42
1 files changed, 40 insertions, 2 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/java_stub_template.txt b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/java_stub_template.txt
index df667e4c71..36575d52ab 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/java_stub_template.txt
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/java_stub_template.txt
@@ -235,8 +235,46 @@ ARGS=(
%java_start_class%
"${ARGS[@]}")
-# Linux per-arg limit MAX_ARG_STRLEN == 128k!
-if (("${#CLASSPATH}" > 120000)); then
+if is_windows && (("${#CLASSPATH}" > 7000)); then
+ # Windows per-arg limit MAX_ARG_STRLEN == 8k
+
+ # Build class path as one single string separated by spaces
+ MANIFEST_CLASSPATH=""
+ IFS=';'
+ for x in $CLASSPATH
+ do
+ # Add file:/ prefix and escaped space characters, it should be a uri.
+ x="file:/${x// /%20}"
+ MANIFEST_CLASSPATH="$MANIFEST_CLASSPATH $x"
+ done
+ unset IFS
+
+ # Create manifest file
+ MANIFEST_FILE="${self}.jar_manifest"
+
+ echo "Manifest-Version: 1.0" >$MANIFEST_FILE
+ CLASSPATH_LINE="Class-Path:$MANIFEST_CLASSPATH"
+ # No line in the MANIFEST.MF file may be longer than 72 bytes.
+ # A space prefix indicates the line is still the content of the last attribute.
+ for i in `seq 0 71 ${#CLASSPATH_LINE}`; do
+ PREFIX=" "
+ if (($i == 0)); then
+ PREFIX=""
+ fi
+ echo "$PREFIX${CLASSPATH_LINE:$i:71}" >>$MANIFEST_FILE
+ done
+ echo "Created-By: Bazel" >>$MANIFEST_FILE
+
+ # Create classpath JAR file
+ MANIFEST_JAR_FILE="${self}-classpath.jar"
+ JARBIN=${JARBIN:-$(rlocation local_jdk/bin/jar.exe)}
+ $JARBIN cvfm $MANIFEST_JAR_FILE $MANIFEST_FILE >/dev/null
+
+ # Execute JAVA command
+ MANIFEST_JAR_FILE=$(cygpath --windows "$MANIFEST_JAR_FILE")
+ $JAVABIN -classpath "$MANIFEST_JAR_FILE" "${ARGS[@]}"
+elif (("${#CLASSPATH}" > 120000)); then
+ # Linux per-arg limit MAX_ARG_STRLEN == 128k
set +o posix # Enable process substitution.
exec $JAVABIN -classpath @<(echo $CLASSPATH) "${ARGS[@]}"
else