Как получить сводный список внешних зависимостей моего проекта maven?
У меня есть большой многомодульный проект Maven, который имеет большое количество зависимостей. Я хотел бы создать полный, отфильтрованный по дубликатам список сторонних зависимостей (то есть всех зависимостей, не использующих идентификатор группы проекта), который есть в этом проекте.
Я пытался использовать mvn dependency:list -DexcludeGroupIds=org.example.projectx
для этой цели, но, кажется, не удается объединить выходные данные в один список. Когда я запускаю команду из корневой командной строки проекта, я получаю вывод следующим образом:
[...]
[INFO] ------------------------------------------------------------------------
[INFO] Building ProjectX: ModuleA - Datatypes 4.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:list (default-cli) @ projectx-moda-datatypes ---
[INFO]
[INFO] The following files have been resolved:
[INFO] org.slf4j:slf4j-api:jar:1.7.10:compile
[INFO] org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] junit:junit:jar:4.12:test
[INFO] com.google.guava:guava:jar:18.0:compile
[INFO]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building ProjectX: ModuleB - Binary 4.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:list (default-cli) @ projectx-modb-binary ---
[INFO]
[INFO] The following files have been resolved:
[INFO] org.slf4j:slf4j-api:jar:1.7.10:compile
[INFO] com.google.guava:guava:jar:18.0:compile
..etc, для каждого подмодуля. Это не только один список (но отдельный список для каждого подмодуля), но, как вы можете видеть, он содержит дубликаты. Более того, фактический вывод, который меня интересует, похоронен в потоке других выходов Maven (загрузка сообщений и т. Д.).
-DoutputFile=<file.txt>
Вариант также не предлагает решения. Результат бега mvn dependency:list -DoutputFile=deps.txt
В моем корне проекта находится не один файл, в котором перечислены все зависимости, а несколько отдельных файлов, по одному в каждом подмодуле-каталоге.
Конечно, я могу перенаправить вывод консоли maven в файл (mvn [options] > output.txt
) и попробуйте какое-нибудь умное регулярное выражение в vi, чтобы отфильтровать его до нужного мне списка. Однако я надеялся, что есть способ получить то, что мне нужно, используя только Maven, либо используя плагин зависимостей, либо какой-либо другой плагин для отчетов, о котором я не знаю.
3 ответа
Вы можете создать дополнительный модуль (или внешний проект maven), имеющий pom-упаковку (то есть пустой) и имеющий в качестве зависимостей все интересующие вас модули / проекты. Затем запустите на нем жизненный цикл сайта (то есть просто мвн сайт). Как часть сгенерированного сайта под target\site, у вас будет:
- СтраницаЗависимости проекта, предоставляющая вам прямые зависимости (не полезно, это будет список введенных вами зависимостей) И транзитивные зависимости (что вы ищете) - все они объединены в один список с GAV, типом, лицензией. Более того, у вас также будет полная зависимость: дерево объединено.
- Страницаконвергенции зависимостей, предоставляющая действительно полезную информацию о конвергенции одной и той же транзитивной зависимости и ее разных версий между другими зависимостями, если таковые имеются
В качестве альтернативы, вы также можете использовать этот специальный модуль / проект для запуска других плагинов, таких как упомянутый вами список зависимостей: список. На этот раз вы получите полный объединенный список, который вы искали, хотя и не в алфавитном порядке, и все еще трудно читать / использовать повторно, поскольку он будет частью вывода сборки. Отчеты сайта вместо этого намного легче читать и обрабатывать (т.е. копировать и вставлять таблицу зависимостей в файл Excel).
Для справки, плагин Maven Project Info Reports будет использоваться фазой сайта. Официальный сайт, здесь.
Я пробовал подобное упражнение и не смог найти никаких конфигураций / целей плагина зависимостей, которые могли бы помочь в этом отношении. Но, к счастью, объединение нескольких команд позволило бы получить список всех уникальных и отсортированных списков всех зависимостей.
mvn dependency:list | grep "\[INFO\][^:]*:[^:]*:[^:]*:[^:]*:.*" | cut -d] -f2- | uniq | sort
Что касается конкретного вопроса, приведенное ниже должно работать.
mvn dependency:list -DexcludeGroupIds=org.example.projectx | grep "\[INFO\][^:]*:[^:]*:[^:]*:[^:]*:.*" | cut -d] -f2- | sort | uniq
Источник: http://maven.40175.n5.nabble.com/list-all-unique-dependencies-of-multi-module-project-td5787840.html
Мне нужно было извлечь список библиотек/тестовых библиотек, чтобы передать их приложению сканирования сонара. Мы не используем плагин maven sonar-scanner, и мне нужен был простой способ, чтобы разработчики не определяли список библиотек вручную. Кроме того, я хотел избежать передачи всего кеша maven сканеру, так как это замедлило бы сканирование.
С помощью следующих команд я могу извлечь список зависимостей и отформатировать его как отсортированный, уникальный, разделенный запятыми список полных путей:
# This will generate the dependency list for each module and store it in separate files (#1)
mvn dependency:list -DoutputAbsoluteArtifactFilename=true -DoutputFile=dependencies.txt -Dsort=true --offline
# To print the test dependencies (#2)
{ find . -name dependencies.txt -exec grep ":test:" {} \;; } | sort | uniq | cut -d":" -f 6 | paste -d , -s
# To print the list of all dependencies except the test ones (#3)
{ find . -name dependencies.txt -exec grep -E ":.+:" {} \;; } | grep -v ":test:" | sort | uniq | cut -d":" -f 6 | paste -d , -s
Описание:
используйте плагин зависимостей, чтобы сгенерировать все зависимости и сохранить их в файлах с именем dependencies.txt, которые будут храниться в папке каждого модуля. Кроме того, он сортирует зависимости и печатает полный путь к артефакту (например, org.springframework.boot:spring-boot-autoconfigure:jar:2.5.6:compile:/usr/share/maven/ref/repository/org/springframework/boot/spring-boot-autoconfigure/2.5.6/spring-boot-autoconfigure-2.5.6.jar)
найти в текущей папке и подпапках все файлы с именем dependencies.txt и передать каждый найденный файл в grep. Затем отфильтруйте только строки, содержащие «:test:», затем отсортируйте все строки (каждая строка является зависимостью), отфильтруйте дубликаты, извлеките 6-е поле (соответствующее имени файла с полным путем), затем вставьте его как последовательность записей, разделенных запятыми
похож на 1, но grep отфильтрует все строки, содержащие как минимум 2 ":" (некоторые строки являются описательными и содержат только 1), затем результат снова передается через grep, чтобы отфильтровать все строки, содержащие ":test:" строка, оставив только время выполнения, компиляцию и т. д. зависимости.
Другая информация
- внешние фигурные скобки ("{...}") используются для создания вложенной оболочки
- вместе ("{}") являются заполнителем для
find
команда и будет заменен путем каждого найденного файла - первый ";" в "\;;" это завершение команды find, а второе — завершение команды в подоболочке