@@ -0,0 +1,2509 @@
+package com.github.sormuras.bach.internal;%0A%0Aimport java.util.Objects;%0Aimport java.util.StringJoiner;%0A%0A/** Maven-related utilities. */%0Apublic class Maven %7B%0A%0A  public static final String CENTRAL_REPOSITORY = %22https://repo.maven.apache.org/maven2%22;%0A%0A  /** Return the string representation of a JAR file hosted at Maven Central. */%0A  public static String central(String group, String artifact, String version) %7B%0A    return central(group, artifact, version, %22%22);%0A  %7D%0A%0A  /** Return the string representation of a JAR file hosted at Maven Central. */%0A  public static String central(String group, String artifact, String version, String classifier) %7B%0A    return Joiner.of(group, artifact, version).classifier(classifier).toString();%0A  %7D%0A%0A  /** A Maven unified resource identifier string representation builder. */%0A  public static class Joiner %7B%0A%0A    /** Create new instance with group, artifact, and version initialized accordingly. */%0A    public static Joiner of(String group, String artifact, String version) %7B%0A      return new Joiner().group(group).artifact(artifact).version(version);%0A    %7D%0A%0A    private String repository = CENTRAL_REPOSITORY;%0A    private String group;%0A    private String artifact;%0A    private String version;%0A    private String classifier = %22%22;%0A    private String type = %22jar%22;%0A%0A    @Override%0A    public String toString() %7B%0A      var joiner = new StringJoiner(%22/%22).add(repository);%0A      joiner.add(group.replace('.', '/')).add(artifact).add(version);%0A      var file = artifact + '-' + (classifier.isBlank() ? version : version + '-' + classifier);%0A      return joiner.add(file + '.' + type).toString();%0A    %7D%0A%0A    public Joiner repository(String repository) %7B%0A      this.repository = Objects.requireNonNull(repository, %22repository%22);%0A      return this;%0A    %7D%0A%0A    public Joiner group(String group) %7B%0A      this.group = Objects.requireNonNull(group, %22group%22);%0A      return this;%0A    %7D%0A%0A    public Joiner artifact(String artifact) %7B%0A      this.artifact = Objects.requireNonNull(artifact, %22artifact%22);%0A      return this;%0A    %7D%0A%0A    public Joiner version(String version) %7B%0A      this.version = Objects.requireNonNull(version, %22version%22);%0A      return this;%0A    %7D%0A%0A    public Joiner classifier(String classifier) %7B%0A      this.classifier = Objects.requireNonNull(classifier, %22classifier%22);%0A      return this;%0A    %7D%0A%0A    public Joiner type(String type) %7B%0A      this.type = Objects.requireNonNull(type, %22type%22);%0A      return this;%0A    %7D%0A  %7D%0A%0A  /** Hidden default constructor. */%0A  private Maven() %7B%7D%0A%7D%0A

Introduce internal Maven-related utilities