$ curl --remote-name-all -L 'https://repo1.maven.org/maven2/com/google/guava/guava/33.6.0-jre/guava-33.6.0-jre.jar' 'https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.3/failureaccess-1.0.3.jar'
$ cat MODULE.bazel
bazel_dep(name = "rules_java", version = "9.6.1")
$ cat X.java
void main() {
var _ = com.google.common.util.concurrent.SettableFuture.create();
}
$ cat BUILD.bazel
load("@rules_java//java:java_binary.bzl", "java_binary")
load("@rules_java//java:java_import.bzl", "java_import")
java_binary(
name = "X",
srcs = ["X.java"],
main_class = "X",
deps = [":guava"],
)
java_import(
name = "guava",
jars = ["guava-33.6.0-jre.jar"],
deps = [":failureaccess"],
)
java_import(
name = "failureaccess",
jars = ["failureaccess-1.0.3.jar"],
)
$ bazel build --experimental_java_classpath=bazel_no_fallback --java_language_version=25 --java_runtime_version=25 //:X
INFO: Analyzed target //:X (0 packages loaded, 0 targets configured).
ERROR: BUILD:4:12: Building X.jar (1 source file) failed: (Exit 1): java failed: error executing Javac command (from java_binary rule target //:X) external/rules_java++toolchains+remotejdk25_linux/bin/java '--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED' '--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED' ... (remaining 19 arguments skipped)
X.java:2: error: cannot access InternalFutureFailureAccess
var _ = com.google.common.util.concurrent.SettableFuture.create();
^
class file for com.google.common.util.concurrent.internal.InternalFutureFailureAccess not found
Target //:X failed to build
Use --verbose_failures to see the command lines of failed build steps.
INFO: Elapsed time: 0.215s, Critical Path: 0.12s
INFO: 2 processes: 2 internal.
ERROR: Build did NOT complete successfully
Is this expected? This behavior can easily turn classpath reduction into a significant pessimization on a real codebase.
I was playing with Bazel's
--experimental_java_classpath=bazel_no_fallbackflag and noticed classpath reduction was defeated by transitivejava_importdependencies.For example:
Is this expected? This behavior can easily turn classpath reduction into a significant pessimization on a real codebase.