code: def binary_shader(self, output_jar, main, jar, custom_rules=None, jvm_options=None):
      
      all_rules = self.assemble_binary_rules(main, jar, custom_rules=custom_rules)
      return self.binary_shader_for_rules(output_jar, jar, all_rules, jvm_options=jvm_options)
docs: Yields an `Executor.Runner` that will perform shading of the binary `jar` when `run()`.
  
      The default rules will ensure the `main` class name is un-changed along with a minimal set of
      support classes but that everything else will be shaded.
  
      Any `custom_rules` are given highest precedence and so they can interfere with this automatic
      binary shading.  In general its safe to add exclusion rules to open up classes that need to be
      shared between the binary and the code it runs over.  An example would be excluding the
      `org.junit.Test` annotation class from shading since both a tool running junit needs to be able
      to scan for this annotation applied to the user code it tests.
  
      :param unicode output_jar: The path to dump the shaded jar to; will be over-written if it
                                 exists.
      :param unicode main: The main class in the `jar` to preserve as the entry point.
      :param unicode jar: The path to the jar file to shade.
      :param list custom_rules: An optional list of custom `Shader.Rule`s.
      :param list jvm_options: an optional sequence of options for the underlying jvm
      :returns: An `Executor.Runner` that can be `run()` to shade the given `jar`.
      :rtype: :class:`pants.java.executor.Executor.Runner`