Shadow Plugin Gradle: Что делает mergeServiceFiles()?

В моем файле build.gradle мне нужно добавить строку:

shadowJar {
    mergeServiceFiles()
}

В противном случае банка работает неправильно. Интересно, что именно эта строка делает? Я использую плагин Gradle в Eclipse Luna. Я создаю jar на одном проекте Java, который зависит от другого.

Ответ 1

mergeServiceFiles объявлен именно здесь, и его реализация заключается в следующем:

/**
 * Syntactic sugar for merging service files in JARs
 * @return
 */
public ShadowJar mergeServiceFiles() {
    try {
        transform(ServiceFileTransformer.class);
    } catch (IllegalAccessException e) {
    } catch (InstantiationException e) {
    }
    return this;
}

Как вы можете видеть, он использует ServiceFileTransfomer который определен здесь. Из его документов:

Изменено из org.apache.maven.plugins.shade.resource.ServiceResourceTransformer.java

Преобразователь ресурсов, который добавляет записи в ресурсах META-INF/services в один ресурс. Например, если имеется несколько ресурсов META-INF/services/org.apache.maven.project.ProjectBuilder, распределенных по многим JAR файлам, все отдельные записи будут объединены в один META-INF/services/org.apache.maven.project. Ресурс .ProjectBuilder упакован в результирующий JAR файл, созданный процессом затенения.