I have a custom Bazel rule which generates a bunch of Java files. The rule is something like this:
def _generator_java_impl(ctx):
tree = ctx.actions.declare_directory(ctx.attr.name + "_srcs")
# Actual generation of the Java files
ctx.actions.run(
...
outputs = [tree],
...
)
return [DefaultInfo(files = depset([tree]))]
generator_java = rule(
implementation = _generator_java_impl,
...
)
In my BUILD file I am using that rule to generate the Java sources and to create a Java library from these sources:
generator_java(
name = "generated_java",
...
)
java_library(
name = "mylib",
srcs = [":generated_java"]
It builds fine using bazel build //:mylib but my JAR file is empty (only MANIFEST is there and misses the Java classes)
I can test that bazel build //:generated_java really generates my Java files and the output folder is not empty.
Any ideas why my Java library is empty?
The Java rules do not support tree artifacts (what's returned from
ctx.actions.declare_directory), and unfortunately, the rules fail on tree artifacts by silently doing nothing as you've discovered.The Java rules do support "source jars", though. A source jar is simply a ZIP archive with a
.srcjarextension. The Java rules will compile the.javafiles within it. So, add a final step to your generator to zip up its outputs.