2012-06-15 4 views
11

У меня есть 2 проекта с использованием Maven. Первый - это библиотека, содержащая классы и методы утилиты. Второй проект - это фактическое приложение, имеющее библиотеку в качестве зависимости. Моя библиотека использует внутреннюю стороннюю библиотеку.Ограничение транзитивной зависимости от области выполнения в Maven

Так что эта зависимость:

  • Моей библиотека: зависит от библиотеки третьей стороны
  • Моего приложения: зависит от моей библиотеки

Однако я не хочу классы сторонних библиотек, которые будут доступны по адресу , компилируют время в мое приложение. Это связано с тем, что приложение поддерживается большой командой, и я хочу, чтобы люди случайно не использовали методы из сторонней библиотеки в приложении, учитывая, что некоторые имена классов и некоторые имена методов похожи друг на друга. Конечно, библиотека третьего уровня должна быть доступна в моей заявке на времени выполнения.

Если область для всех моих зависимостей была компиляции, она не достигла бы моей цели. Есть ли способ достичь этого в Maven 3?

ответ

16

Очень хороший вопрос, и, к сожалению, вы не можете это сделать, используя Maven 3 или 2 или любую другую версию из-за ее фундаментального дизайна. То, о чем вы спрашиваете, на самом деле является желаемым и идеальным поведением, поскольку на самом деле зависимости compile от артефакта должны быть транзитивными с областью runtime. Однако такой дизайн приводит к некоторым проблемам. Как вы можете прочитать в Maven's Introduction to the Dependency Mechanism о compile объеме:

Предполагается, что это должно быть во время выполнения сферы вместо того, чтобы все зависимости компиляции должны быть явно указаны - однако, есть случай, когда библиотека зависит on расширяет класс из другой библиотеки , заставляя вас иметь доступную во время компиляции. Для этой причины , компиляция зависимостей времени остается как область компиляции, даже когда они транзитивны.

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

+1

Я надеялся, что есть способ сделать это , Спасибо за ваш ответ, Михал. – Juanal

+0

Это ответили годы назад. Есть ли способ сделать это сейчас? Мне интересно, можете ли вы каким-то образом использовать область «import» для взлома решения здесь? –

+1

Я не думаю, что здесь что-то изменилось. Как я уже сказал в 2012 году, это очень фундаментальный дизайн Maven. Я считаю, что сейчас нет способа изменить это, так как именно так Maven делает это с самого начала. –

4

Ничто не изменилось за последние три года, поэтому ответ Михала по-прежнему верен: нет возможности ограничить транзитивную видимость в Maven.

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

2

В вашем приложении вы можете объявить явную зависимость от сторонней библиотеки, используя область выполнения.

Это предотвращает просмотр сторонней библиотеки во время компиляции, и поэтому никакие прямые действия не могут проникнуть внутрь. Однако он все равно будет присутствовать во время выполнения (так как это необходимо вашей библиотеке).

Это работает, но неудобно и заслуживает объяснительного комментария XML в pom.

0

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

  • исключающих транзитивная зависимость, то от них зависят напрямую (вы должны управлять номерами версий самостоятельно)
  • Используйте контроль импорта контрольного образца, а также CI. Таким образом, члены команды могут использовать транзиты, но тогда проверка maven завершится ошибкой
  • Используйте град. Это решение многих ограничений Maven
Смежные вопросы