2016-03-11 8 views
4

Я столкнулся с JIRA post, который дает решение, включающее тег исключения в каждом теге зависимостей POM.Как отключить транзитивные зависимости для проектов maven?

Но у меня есть большое количество проектов, и каждый проект имеет огромное количество тегов зависимостей. Невозможно включить этот <exclusion> в каждый из тегов зависимостей.

Вопрос: Есть ли способ глобально отключить импорт транзитивных зависимостей в maven?

+0

Но зачем вам нужен такой механизм для всех зависимостей всех проектов? В этом случае, вероятно, муравь - лучший выбор. В противном случае скрипт выполнил бы эту работу, но он может легко стать кошмаром обслуживания ihmo. –

+0

Мы должны сделать это по соображениям безопасности. У нас есть Artifactory repo, где мы поддерживаем все и только необходимые зависимости. Мы не хотим, чтобы ненужные зависимости проникали в пакет. Мне было бы интересно узнать, что сделает скрипт ant, о котором вы говорите. Не могли бы вы объяснить это решение. Это то же самое, что и замена текста на POM? – AshwiniR

+0

Но тогда было бы проще переключить Artifactory в автономном режиме, чтобы вы полностью управляли своим контентом? Я имел в виду муравей, потому что вы используете физические файлы в качестве зависимостей, а не деклараций и транзитивного управления, поэтому вы полностью контролируете то, что используете. Сценарий, который я имел в виду, вероятно, будет делать то же самое, что и объяснение ниже. –

ответ

3

В Maven вы не можете отключить транзитивные зависимости для всех объявляемых зависимостей единственным образом, как заявило official documentation

Почему исключения сделаны на основе за зависимость, а не на уровне POM

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


В самом деле, так как Maven 3.2.1 можно указать символы, чтобы исключить все транзитивные зависимости для определенной зависимости, но это по-прежнему в зависимости и не глобальные.

Что вы на самом деле хотели бы иметь что-то вроде следующего за каждый и каждый зависимости в каждом ПОМ (!!):

<dependency> 
    <groupId>groupId</groupId> 
    <artifactId>artifactId</artifactId> 
    <version>version</version> 
    <exclusions> 
     <exclusion> 
      <groupId>*</groupId> 
      <artifactId>*</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

Хотя это не рекомендуется, так как он может легко (и отрицательно) влияет на ремонтопригодность соответствующих проектов, возможное решение будет иметь общую parent POM для всех заинтересованных проектов, так что каждый пОМ заявит:

<parent> 
    <groupId>com.sample</groupId> 
    <artifactId>projects-governance</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
</parent> 

Затем в соответствующем родителе П вы бы:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.sample</groupId> 
    <artifactId>modules</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <dependencyManagement> 
     <dependencies> 
      <!-- for each and every foreseen dependency of children poms --> 
      <dependency> 
       <groupId>groupId</groupId> 
       <artifactId>artifactId</artifactId> 
       <version>version</version> 
       <exclusions> 
        <exclusion> 
         <groupId>*</groupId> 
         <artifactId>*</artifactId> 
        </exclusion> 
       </exclusions> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 
</project> 

Обратите внимание на раздел dependencyManagement, здесь мы говорим: для всех детей РОМА, когда вы используете заинтересованные зависимости Заявляю, для этого GroupID и это artifacId по умолчанию этой версии и это исключение будет применяться.

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

Однако вам все равно необходимо указать в родительском POM все зависимости, используемые всеми проектами, и применить для всех из них исключение подстановки.


Чтобы получить список всех зависимостей в проект, вы, вероятно, можете пойти на ручной подход (открыть каждую POM!) Или работать по каждому проекту следующее:

mvn dependency:list -DexcludeTransitive=true -DoutputFile=dependencies.txt -DappendOutput=true 

Maven Dependency Plugin затем записать в указанном файле dependencies.txt декларируемые зависимости (в формате groupId:artifactId:packaging:version:scope) заинтересованного проекта. Обратите внимание, что последний параметр, appendOutput, может быть полезен для записи в конце того же файла, чтобы держать их централизованными для дальнейшей обработки (удаление дубликатов, перемещение их к новому родительскому pom).


Чтобы применить шаблоны для всех объявленных зависимостей, быстрый намек просто заменить (с помощью любого текстового редактора или с помощью сценариев оболочки) следующие лексемы:

</version> 
</dependency> 

К следующим:

</version> 
    <exclusions> 
     <exclusion> 
      <groupId>*</groupId> 
      <artifactId>*</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

Сохраните файл. И автоматически вы бы совершенно безопасно применяли исключения для всех зависимостей.

Обновление от OP: Наконец, мы решили не делать этого и вместо этого решить исходную проблему, используя команду дерева зависимостей, чтобы генерировать отчеты о новых добавленных/удаленных зависимостях для каждого проекта и транслировать их.

+0

Я прочитал официальную документацию. Спасибо. Они иллюстрируют больше из пользовательских представлений проектов. Но меня больше беспокоят артефакты, которые maven извлекает из своего центрального хранилища. Этот подход тоже пришел мне на ум ... Угадай, что с этим нужно будет ... – AshwiniR

Смежные вопросы