text: load("//java/private:common.bzl", "has_maven_deps")
  load("//java/private:dist_info.bzl", "DistZipInfo", "dist_aspect", "separate_first_and_third_party")
  
  def _java_dist_zip_impl(ctx):
      files = []
      for file in ctx.files.files:
          files.append("%s=%s" % (file.basename, file.path))
  
      infos = [d[DistZipInfo] for d in ctx.attr.deps]
      combined = depset(transitive = [i.dist_infos for i in infos]).to_list()
  
      inputs = depset(
          ctx.files.files,
          transitive = [i.binary_jars for i in combined] + [i.source_jars for i in combined],
      )
  
      (first, third) = separate_first_and_third_party(ctx.attr.third_party_prefixes, infos)
  
      first_party = []
      third_party = []
  
      for info in first:
          [first_party.append("%s.jar=%s" % (info.name, fp.path)) for fp in info.binary_jars.to_list()]
          [first_party.append("%s-sources.jar=%s" % (info.name, fp.path)) for fp in info.source_jars.to_list()]
  
      for info in third:
          [third_party.append("lib/%s.jar=%s" % (info.name, tp.path)) for tp in info.binary_jars.to_list()]
  
      out = ctx.actions.declare_file("%s.zip" % ctx.attr.name)
      args = ctx.actions.args()
      args.add_all(["c", out])
      args.add_all(sorted(files))
      args.add_all(sorted(first_party))
      args.add_all(sorted(third_party))
  
      ctx.actions.run(
          executable = ctx.executable._zip,
          arguments = [args],
          outputs = [out],
          inputs = inputs,
      )
  
      return [
          DefaultInfo(files = depset([out])),
      ]
  
  java_dist_zip = rule(
      _java_dist_zip_impl,
      attrs = {
          "files": attr.label_list(
              default = [],
              allow_files = True,
          ),
          "deps": attr.label_list(
              providers = [
                  [DistZipInfo],
              ],
              aspects = [
                  dist_aspect,
                  has_maven_deps,
              ],
          ),
          "third_party_prefixes": attr.string_list(),
          "_zip": attr.label(
              default = "@bazel_tools//tools/zip:zipper",
              executable = True,
              cfg = "host",
          ),
      },
  )
  