|  | 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, | 
|  | ) |