Как найти ненужные зависимости в мультипроекте maven?

Если вы разрабатываете большой развивающийся проект с несколькими модулями maven, кажется неизбежным, что есть некоторые зависимости, данные в поминах, которые являются ненужными, поскольку они транзитно включены в другие зависимости. Например, это происходит, если у вас есть модуль A, который изначально включает C. Позже вы рефакторинг и A зависете от модуля B, который, в свою очередь, зависит от C. Если вы недостаточно осторожны, вы завершите работу как с B, так и с C в Список зависимостей. Но, конечно, вам не нужно класть C в pom, так как он включен транзитивно. Есть ли инструмент для поиска таких ненужных зависимостей?

(Эти зависимости на самом деле не навредят, но они могут скрыть вашу фактическую структуру модуля и иметь меньше вещей в помпе, как правило, лучше.: -)

Ответ 1

В некоторой степени вы можете использовать dependency:analyze, но это не слишком полезно. Также проверьте JBoss Tattletale.

Некоторое время назад я начал maven-storyteller-plugin, чтобы иметь возможность глубже анализировать поры, но проект очень вдали от производства/общественного использования. Вы можете использовать цель storyteller:recount для анализа неиспользуемых/избыточных зависимостей.

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

Обновление ноября 2014 года.

Я просто перенес мой старый код плагина Storyteller в GitHub. Я обновлю его и отправлю в центр, чтобы он был полезен другим.

Ответ 2

I

personaly использует редактор pom M2Eclipse для визуального просмотра дерева зависимостей (2D-дерево). Затем я заглядываю в свои доступные каталоги lib (war, ear). Затем все еще в средстве просмотра зависимостей M2Eclipse pom я обращаюсь к каждому третьему лицу и нажимаю правой кнопкой мыши на зависимости, которую я хочу исключить (исключение автоматически добавляется в правильную зависимость).

Нет золотых правил, просто некоторые основные советы:

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

вам нужно угадать по имени зависимостей, что вам нужно будет исключить, лучшим примером могут быть синтаксические анализаторы, трансформатор, documentbuilder: xalan, xerces, xalan alfred и co. попробуйте удалить их и использовать внутренний парсер jdk1.6, общий материал apache, log4j также стоит посмотреть.

также регулярно смотрите в доставке lib, если у вас нет дубликатов библиотек с другой версией (зависимый разработчик maven должен избегать этого)

снизу вверх, начните с ваших общих модулей, затем поднимитесь до уровня обслуживания, обрезайте зависимостей в каждом модуле, не пытайтесь запускать модули уха/войны, это будет слишком сложно

часто проверяйте, будет ли ваша работа по-прежнему работать, либо тестируя, либо сравнивая и старая версия с новой (особенно в каталоге web-inf/lib, что исчезло с winmerge/beyoncompare)

Ответ 3

Когда у вас есть A → B, B → C, а затем реорганизуйте таким образом, чтобы A → (B, C). IF, это то, что A все еще компилируется против B, вы очень не хотите просто подбирать зависимость, потому что получаете ее транзитивно.

Вспомните случай, когда A → (B-1.0, C-1.0), B-1.0 → C-1.0. Все в синхронизации, поэтому, чтобы избежать "дублирования", вы удаляете C из A. Затем вы обновляете A, чтобы использовать B-2.0 → C-2.0. Вы начинаете видеть ошибки, потому что A хочет C-1.0 классы, но обнаружил классы C-2.0. Несмотря на то, что в этом сценарии быстро сочетается, это гораздо меньше, если у вас много зависимостей.

Вам очень нужна информация в папке A, в которой говорится, что она явно ожидает найти C-1.0 в пути к классам, чтобы вы могли понять, когда у вас есть транзитивная зависимость конфликты. Опять же, Maven выполнит работу по обеспечению того, чтобы "ближайшая" версия какой-либо конкретной банки заканчивалась на пути к классу. Но когда все идет не так - вам нужны все метаданные зависимости, которые вы можете получить.

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