Подтвердить что ты не робот

Есть ли возможность Maven "только для компилятора" для артефактов зависимостей

Я понимаю, что это скорее семантический поиск, а не функциональный квест.

У меня есть три типа зависимостей для компиляции:

  • Область только для компиляции, не используемая во время выполнения. GWT на стороне клиента, MVP4G, RestyGWT, процессоры аннотаций хранения исходного кода. Я использую REST, поэтому мне не нужна сторона сервера GWT.

  • Предоставлено - спящий режим, необходимый для компиляции, но предоставленный JBoss.

  • Компилировать + баннеры времени выполнения.

В случае 2 мы можем использовать предоставленную область. Случай 3, мы будем использовать область компиляции.

Однако для случая 1 я использую предоставленную область, хотя JBoss не предоставляет эти файлы вообще. Они также не нужны во время выполнения.

В любом случае, разве вы не думаете, что Maven должен предусмотреть синоним "предоставленного" для области, где артефакты действительно не нужны, кроме как во время компиляции? Возможно, должна ли быть область "только для компиляции"?

4b9b3361

Ответ 1

Если в баночках нет истинных зависимостей "runtime" (только для построения), но не для конечного артефакта, вы можете исключить их различными способами:

Я согласен, что отправка ненужных классов раздражает (я видел junit и testng jars в производственных развертываниях - brrrr...), но для всех практических целей это довольно незначительный.

Если у вас есть конфликт зависимости (например, доставка версии "все депо" библиотеки или фреймворка), это другая история, но она не похожа на то, с чем вы здесь сталкиваетесь.

Ответ 2

Не жалуйтесь, что язык не предлагает прекрасных различий, если вы знаете только половину своего словарного запаса.

Если зависимость используется только для построения, например, для обработчика аннотаций, она должна быть maven <plugin> или <dependency>.

В противном случае, если он находится в пути к классу компиляции, необходимо будет связать сгенерированный файл класса во время выполнения. Тогда есть два случая:

  • Всегда нужно загружать этот класс
    • класс должен быть отправлен как часть приложения: <scope>compile</scope>
    • класс должен предоставляться средой выполнения: <scope>provided</scope>
  • Иногда это необходимо (потому что этот класс будет загружен только при особых обстоятельствах): <optional>true</optional>

Единственный вариант, который не рассматривается, заключается в компиляции Java-программы и никогда не запускается в JVM. Это действительно непонятный случай использования, и я не могу ошибаться разработчики maven за то, что они не включают сферу действия, чтобы выразить это различие, особенно потому, что это не имеет отношения к основной ответственности Maven (создание программного обеспечения).