diff --git a/WORKSPACE b/WORKSPACE index e4b4a3bb1..539dc8cc4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1,6 +1,16 @@ workspace(name = "io_bazel_rules_scala") + load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +#used to test what happens when classpath is too large +#until https://github.com/bazelbuild/bazel/issues/6955 is resolved +http_archive( + name = "java_stub_template", + sha256 = "1859a37dccaee8c56b98869bf1f22f6f5b909606aff74ddcfd59e9757a038dd5", + urls = ["https://github.com/bazelbuild/rules_scala/archive/8b8271e3ee5709e1340b19790d0b396a0ff3dd0f.tar.gz"], + strip_prefix = "rules_scala-8b8271e3ee5709e1340b19790d0b396a0ff3dd0f/java_stub_template", +) + load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") load("//scala:scala.bzl", "scala_repositories") diff --git a/scala/private/rule_impls.bzl b/scala/private/rule_impls.bzl index 9d89e8e02..9436e2d0a 100644 --- a/scala/private/rule_impls.bzl +++ b/scala/private/rule_impls.bzl @@ -550,16 +550,18 @@ def _path_is_absolute(path): def _runfiles_root(ctx): return "${TEST_SRCDIR}/%s" % ctx.workspace_name -def _write_java_wrapper(ctx, args = "", wrapper_preamble = ""): - """This creates a wrapper that sets up the correct path - to stand in for the java command.""" - +def _java_bin(ctx): java_path = str(ctx.attr._java_runtime[java_common.JavaRuntimeInfo].java_executable_runfiles_path) if _path_is_absolute(java_path): javabin = java_path else: runfiles_root = _runfiles_root(ctx) javabin = "%s/%s" % (runfiles_root, java_path) + return javabin + +def _write_java_wrapper(ctx, args = "", wrapper_preamble = ""): + """This creates a wrapper that sets up the correct path + to stand in for the java command.""" exec_str = "" if wrapper_preamble == "": @@ -576,13 +578,18 @@ JAVA_EXEC_TO_USE=${{REAL_EXTERNAL_JAVA_BIN:-$DEFAULT_JAVABIN}} """.format( preamble = wrapper_preamble, exec_str = exec_str, - javabin = javabin, + javabin = _java_bin(ctx), args = args, ), is_executable = True, ) return wrapper +def _jar_path_based_on_java_bin(ctx): + java_bin = _java_bin(ctx) + jar_path = java_bin.rpartition("/")[0] + "/jar" + return jar_path + def _write_executable(ctx, rjars, main_class, jvm_flags, wrapper, use_jacoco): template = ctx.attr._java_stub_template.files.to_list()[0] @@ -613,6 +620,7 @@ def _write_executable(ctx, rjars, main_class, jvm_flags, wrapper, use_jacoco): substitutions = { "%classpath%": classpath, "%javabin%": javabin, + "%jarbin%": _jar_path_based_on_java_bin(ctx), "%jvm_flags%": jvm_flags, "%needs_runfiles%": "", "%runfiles_manifest_only%": "", @@ -638,6 +646,7 @@ def _write_executable(ctx, rjars, main_class, jvm_flags, wrapper, use_jacoco): "%classpath%": classpath, "%java_start_class%": main_class, "%javabin%": javabin, + "%jarbin%": _jar_path_based_on_java_bin(ctx), "%jvm_flags%": jvm_flags, "%needs_runfiles%": "", "%runfiles_manifest_only%": "", diff --git a/test/BUILD b/test/BUILD index 0fe66d426..fe788dbff 100644 --- a/test/BUILD +++ b/test/BUILD @@ -434,6 +434,13 @@ scala_specs2_junit_test( "//test:test_scala_proto_server", ]] +sh_test( + name = "test_binary_run_with_large_classpath", + srcs = ["test_binary_run_with_large_classpath.sh"], + args = ["$(location //test/src/main/scala/scalarules/test/large_classpath:largeClasspath)"], + data = ["//test/src/main/scala/scalarules/test/large_classpath:largeClasspath"], +) + # Make sure scala_binary works in genrule environment genrule( name = "ScalaBinaryInGenrule", diff --git a/test/test_binary_run_with_large_classpath.sh b/test/test_binary_run_with_large_classpath.sh new file mode 100755 index 000000000..24add6a70 --- /dev/null +++ b/test/test_binary_run_with_large_classpath.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +echo "Executing: " $@ +#limiting the classpath to simulate a large classpath which is over the OS limit +export CLASSPATH_LIMIT=10 +$@