Переходные файловые зависимости в Gradle - PullRequest
9 голосов
/ 28 ноября 2011

Я хотел бы контролировать, какие из моих зависимостей в многопроектной сборке Java являются транзитивными.Мое текущее решение заключается в настройке конфигурации «экспорта» в корневом проекте:

allprojects {
    configurations {
        export {
            description = 'Exported classpath'
        }
        compile {
            extendsFrom export
        }
    }
}

Проект A имеет несколько файловых зависимостей:

dependencies {
    compile files('A.jar', 'B.jar')
    export files('C.jar')
}

Проект B зависит от проекта A, но только C.jar должно быть на пути к классам для компиляции, поэтому добавьте:

dependencies {
    export project(path: ':A', configuration:'export')
}

Это даст желаемые результаты, A.jar и B.jar не находятся на пути к классам, но C.jarнаходится на пути к классам для компиляции.

Я не уверен, является ли это «нездоровым» способом ведения дел.Чтобы настроить транзитивность, я бы предпочел указать атрибут или закрытие конфигурации для записей зависимостей в проекте A вместо использования другой конфигурации «экспорта».

Возможно ли это для файловых зависимостей или есть другой способ добиться этого?

1 Ответ

3 голосов
/ 02 декабря 2011

Если я правильно понимаю ваш сценарий, то да, это легко сделать.Просто добавьте закрытие опций в конец объявления зависимостей, чтобы предотвратить переходные зависимости (я изменил A, B, C .jar на X, Y, Z, потому что я предполагаю, что они не совпадают с проектами A и B):

// Project A build.gradle
dependencies {
   compile(files('X.jar', 'Y.jar')) { transitive = false }
   export files('Z.jar')
}

Что препятствует добавлению X.jar и Y.jar в путь к классам для проекта B.

В качестве альтернативы, и я не знаю, насколько хорошо это будет работать дляВы и не очень рекомендуете это (просто хотите, чтобы вы знали о возможностях), вы можете сделать это в build.gradle проекта B:

configurations.compile.dependencies.find { it.name == "A.jar" }.exclude(jar: it)
configurations.compile.dependencies.find { it.name == "B.jar" }.exclude(jar: it) 

Надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...