def _classpath_collector(ctx): all = [] for d in ctx.attr.deps: if JavaInfo in d: all.append(d[JavaInfo].transitive_runtime_deps) if hasattr(d[JavaInfo].compilation_info, "runtime_classpath"): all.append(d[JavaInfo].compilation_info.runtime_classpath) elif hasattr(d, "files"): all.append(d.files) as_strs = [c.path for c in depset(transitive = all).to_list()] ctx.actions.write( output = ctx.outputs.runtime, content = "\n".join(sorted(as_strs)), ) classpath_collector = rule( attrs = { "deps": attr.label_list(), }, outputs = { "runtime": "%{name}.runtime_classpath", }, implementation = _classpath_collector, )