diff options
author | Yun Peng <pcloudy@google.com> | 2017-01-25 15:05:14 +0000 |
---|---|---|
committer | Laszlo Csomor <laszlocsomor@google.com> | 2017-01-25 22:23:11 +0000 |
commit | 752b61ee4d839b6b9680353c0d1d02de2ad13f14 (patch) | |
tree | 0440e4926cee2c9357f18211ebafb145d36e528b /src/main/java | |
parent | 389c2b65d4aea0a2e8649bd77d8f4200a485da1f (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.txt | 42 |
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 |