Задача Gradle портит зависимости во время выполнения - PullRequest
0 голосов
/ 29 октября 2018

Еще одно странное поведение gradle ...

Итак, я нашел этот пост: Модуль исключения Gradle для задачи копирования

Абсолютно хорошо и работает как брелок для исключения вещей из копирования.

Но вот где это становится интересным. Вот как выглядит моя задача копирования:

task copyDependencies(type: Copy) {
    into "$buildDir/libs/dependencies"
    from configurations.runtime {
        exclude module: 'groovy'
        exclude module: 'aws-java-sdk-s3'
        exclude module: 'commons-io'
    }
}

Если я попытаюсь запустить Приложение через задачу Gradles 'application run'. Сбой при «Главный класс xxx не найден или загружен» . Углубившись в проблему, я заметил, что Groovy не может быть решен.

Я даже не запускаю эту задачу или не зависим от нее. Но если я закомментирую строку 4 так:

task copyDependencies(type: Copy) {
    into "$buildDir/libs/dependencies"
    from configurations.runtime {
        //exclude module: 'groovy'
        exclude module: 'aws-java-sdk-s3'
        exclude module: 'commons-io'
    }
}

Приложение запускается как обычно, пока не достигнет точки, где ему необходим Commons-IO. Я все еще хочу использовать эту задачу copyDependencies в другое время, не меняя при этом код.

Может кто-нибудь объяснить мне это поведение?

Я представляю, что управляю конфигурацией. Runtime где-нибудь в файле Gradle, меняет ли это для любой другой задачи?

1 Ответ

0 голосов
/ 30 октября 2018

В вашем блоке конфигурации from вы ссылаетесь на конфигурацию runtime, но в то же время вы изменяете эту конфигурацию, добавляя некоторые правила исключения. Это изменит оригинальную (и уникальную) runtime конфигурацию, которая будет использоваться всеми другими задачами в вашем проекте сборки, как вы уже догадались. Это объясняет ошибку «Main Class xxx не найден или загружен» , возникающую при попытке выполнить задачу run, поскольку конфигурация runtime (classpath) не содержит необходимой библиотеки.

Если вы хотите написать правила исключения по группе и / или модулю в вашей задаче copyDependencies, одним из возможных способов будет работа с копией оригинала runtime конфигурация; для этой цели вы можете определить новую конфигурацию :

configurations{
    runtimeDeps.extendsFrom runtime
}

task copyDependencies(type: Copy) {
    into "$buildDir/libs/dependencies"
    from configurations.runtimeDeps {
        exclude module: 'groovy'
        exclude module: 'aws-java-sdk-s3'
        exclude module: 'commons-io'
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...