Доступ к зависимостям плагина Gradle в другом проекте - PullRequest
0 голосов
/ 19 июня 2020

Я работаю над проектом, который требует и запрещает определенные c зависимости. В настоящее время у меня есть автономный плагин Gradle, который имеет необходимые значения и пытается глобально исключить некоторых представителей. По какой-то причине в проекте, где я применяю плагин, я не могу получить доступ к зависимостям, реализованным в плагине Gradle. Я тестировал проект, который реализует плагин через gradle dependencies, и проверял, указаны ли в дереве требуемые зависимости.

В этом примере мой плагин втягивает group: 'org.slf4j', name:'slf4j-api', transitive: true, и мне нужно чтобы иметь возможность видеть / знать, что он втягивается как переходный деп в реализующий проект.

плагин Gradle build.gradle :

buildscript {
    repositories {
        maven { url mainUrl }
    }
}

apply plugin: 'java'
apply plugin: 'maven'

repositories {
    maven {
        url mainUrl
    }
}

dependencies {
    implementation gradleApi()
    // ...
    compile(group: 'org.slf4j', name:'slf4j-api', transitive: true)

}

Проект который реализует плагин Gradle build.gradle :

buildscript {
    repositories { 
        maven { url mainUrl
            metadataSources {
                mavenPom()
                artifact()
            }
        }
    }
    configurations.all { resolutionStrategy.cacheDynamicVersionsFor 0, 'minutes' }
    dependencies {
        classpath 'com.gradlepluginpath:gradle-plugin:1.0.+'
    }
}
plugins {
    id 'java'
}

apply plugin: "gradle-plugin"

sourceCompatibility = 1.8

repositories {
    maven{
        url mainUrl
    }
}

dependencies {
   //...
}

После запуска gradle dependencies, org.slf4j не отображается в дереве Dep для реализуемого проекта.

Любая помощь приветствуется.

Также существует проблема с неработающим глобальным исключением. С этим блоком в подключаемом модуле gradle build.gradle , log4j модули все еще отображаются в дереве Dep для реализуемого проекта.

configurations {
    classpath {
        all*.exclude group: 'org.apache.logging.log4j', module: '*'
    }
}

1 Ответ

0 голосов
/ 20 июня 2020

Вы не увидите зависимости плагина Gradle в зависимостях приложения, они полностью разделены по дизайну.

Если ваш плагин Gradle требует / использует org.slf4j:slf4j-api, вы определяете его в файле Gradle вашего плагина Gradle , что вы и сделали.

Если ваше приложение также требует org.slf4j:slf4j-api, тогда вам необходимо определить зависимость в файле Gradle приложения (Kotlin DSL):

dependencies {
    implementation("org.slf4j:slf4j-api:1.7.30") {
        isTransitive = true
    }
}

Также существует проблема с неработающим глобальным исключением. С этим блоком в плагине gradle build.gradle модули log4j по-прежнему отображаются в дереве депов для реализуемого проекта.

Конфигурация сборки для плагина и проекта - это две разные вещи. Вы должны улучшить свой плагин Gradle, чтобы исключить log4j с помощью Gradle API:

import org.gradle.api.Plugin;
import org.gradle.api.Project;

import java.util.HashMap;
import java.util.Map;

public class MyCustomGradlePlugin implements Plugin<Project> {

    @Override
    public void apply(Project project) {
        Map<String, String> log4j = new HashMap<>();
        log4j.put("group", "org.apache.logging.log4j");
        log4j.put("module", "*");
        project.getConfigurations().all((configuration) -> configuration.exclude(log4j));
    }

}
...