Почему я должен указывать и «время выполнения», и «компилировать» для одной и той же зависимости?

Я полагаюсь на несколько артефактов, которые мне нужны как для компиляции, так и для запуска моего приложения.

Согласно документам Gradle, конфигурация среды выполнения расширяет конфигурацию компиляции, поэтому наверняка добавление зависимости с использованием runtime подразумевает неявную зависимость compile?

По крайней мере, это было мое предположение, но оно не работает. Когда только в зависимости от артефакта, использующего runtime, мой проект больше не компилируется. Я буквально должен:

compile 'oauth.signpost:signpost-core:1.2.1.2'
runtime 'oauth.signpost:signpost-core:1.2.1.2'

чтобы приложение одновременно компилировало и видело классы Signpost во время выполнения.

Я что-то упускаю? Это просто выглядит не так...


person Matthias    schedule 14.01.2011    source источник


Ответы (1)


Почти правильно. Конфигурация среды выполнения действительно расширяет конфигурацию компиляции (документы ). Это означает, что любая зависимость, добавленная в конфигурацию compile, доступна в конфигурации runtime (docs).

compile 'oauth.signpost:signpost-core:1.2.1.2' будет достаточно, чтобы получить этот артефакт как во время выполнения, так и во время компиляции.

person Nikita Skvortsov    schedule 14.01.2011
comment
Я вижу - как странно. Просто пытаюсь понять, как это работает тогда. Глядя на gradle.org/0.9.1/docs/ userguide/, означает ли это, что любая конфигурация на рис. 20.2 представляет собой комбинацию всех конфигураций, к которым есть входящие стрелки? Думая о «расширении» в классическом смысле «наследования», можно было бы предположить обратное. - person Matthias; 15.01.2011
comment
Да, и: правильно ли тогда предположить, что конфигурация «среды выполнения» Gradle соответствует «предоставленной» области действия Maven? - person Matthias; 15.01.2011
comment
На схеме руководства пользователя 20.2 любая конфигурация представляет собой комбинацию всех исходящих путей, например testRuntime включает в себя все от runtime до compile, потому что исходящая стрелка показывает, что testRuntime расширяет runtime - person Nikita Skvortsov; 15.01.2011
comment
Я тоже так думал, но, следуя той же логике, runtime будет включать конфигурацию compile, а не наоборот. Это прямо противоположно тому, что вы сказали в своем ответе! - person Matthias; 16.01.2011
comment
О, снэп, кажется, теперь я понял. Я думаю, что моя ошибка заключалась в том, что я думал о конфигурациях как о поведении, а не как о наборах. Слово «продлевает» меня смутило. Расширение здесь на самом деле означает надмножество. Поэтому, если я добавлю что-то к compile, то это также будет видно всему, что зависит от runtime, поскольку это надмножество compile. Таким образом, добавление чего-либо только во время выполнения не будет видно ни для одной задачи, использующей конфигурацию compile. Имеет ли это смысл? - person Matthias; 16.01.2011
comment
Отлично, вы поняли идею! Может быть, я недостаточно ясно выразился в своем ответе) - person Nikita Skvortsov; 17.01.2011
comment
нет-нет, я думаю, что я просто не в лучшей форме в данный момент... еще раз приветствую вашу помощь. - person Matthias; 18.01.2011
comment
GRADLE-784 предлагает обходное решение. - person Uriah Carpenter; 26.01.2011
comment
лол, Матиас, сначала я разделил твое замешательство. Теперь, после чашки кофе, я не понимаю твоего замешательства. Почему-то все очень запутанно =) Но, говоря с моей последней точки зрения, если B расширяет A, то B есть A, и все в A видно в B, а не наоборот. Таким образом, если компиляция — это A, а среда выполнения — B, то все артефакты, доступные в компиляции, доступны во время выполнения, а не наоборот. Таким образом, я пытаюсь сказать, что это за разговоры о поведении и суперсетах? Версия расширений Gradle такая же, как и объектно-ориентированные языки? - person Martin Andersson; 02.03.2015
comment
о, теперь я понял! Ваш вопрос заключался в том, зачем нам что-то добавлять в компиляцию, если среда выполнения должна расширять компиляцию. Подводя итог для других людей, которые все еще находятся в замешательстве: все зависимости, добавленные для компиляции, являются доступными во время выполнения, поскольку время выполнения расширяет компиляцию. Но, если вы перейдете по второй ссылке в ответе Никиты выше, станет ясно, что мы говорим не о наследовании классов, мы говорим о ссылке на реальный Set. Чтобы среда выполнения могла видеть зависимости компиляции, сначала необходимо добавить зависимости для компиляции, что и является тем, о чем идет речь в исходном вопросе Маттиаса. - person Martin Andersson; 02.03.2015