Ответ 1
Затем я просмотрю документы Джексона, чтобы увидеть, когда этот метод был добавлен или удален. Это обычно довольно утомительно, так как я вручную проверяю api docs для каждой версии (вопрос 1: есть ли лучший способ?)
Для проверки совместимости API (разрыва) существует несколько инструментов, которые автоматически анализируют банки и предоставляют вам правильную информацию. Из этого в столбце "Переполнение стека" есть хорошие подсказки для некоторых удобных инструментов.
JAPICC кажется неплохим.
Затем я использую
mvn dependency:tree
, чтобы выяснить, какая версия Джексона, которую я фактически использую (вопрос 2: есть ли автоматический способ запросить maven, какая версия jar используется, а не расчесывать выход дерева?)
maven-dependency-tree
- это, безусловно, путь, но вы можете отфильтровать с начала области и получить только то, что вы на самом деле ищете, используя includes
следующим образом:
mvn dependency:tree -Dincludes=<groupId>
note: вы также можете предоставить дополнительную информацию опции includes
в форме groupId:artifactId:type:version
или использовать такие подстановочные знаки, как *:artifactId
.
Кажется, небольшой намек, но в больших проектах со многими зависимостями, сужающими его выход, очень помогает. Обычно просто groupId
должно быть достаточно в качестве фильтра, *:artifactId
, вероятно, самый быстрый, хотя если вы ищете определенную зависимость.
Если вас интересует list зависимостей (а не как дерево), также в алфавитном порядке (довольно удобно во многих сценариях), то также может помочь следующее:
mvn dependency:list -Dsort=true -DincludeGroupIds=groupId
Вопрос 3: Как maven использует библиотеки в затененных банках, когда происходит разрешение зависимостей? Как и любой другой?
Затененными банками вы можете означать:
- живые банки, которые также привносят в кластер. В этом случае они рассматриваются как одна зависимость, одна единица для Maven Dependency Mediation, тогда ее содержимое будет частью пути к классу проекта. В общем, у вас не должно быть жирных банок как часть ваших зависимостей, так как у вас нет контроля над упакованными библиотеками, которые он вносит.
- банки с затененными (переименованными) пакетами. В этом случае - опять же - нет никакого контроля в отношении Maven Dependency Mediation: это одна единица, одна банка, основанная на ее GAVC (GroupId, ArtifactId, Version, Classifier), которая делает ее уникальной. Его содержимое затем добавляется к пути к классу проекта (в зависимости от зависимостей область, но поскольку его пакет был переименован, у вас могут быть трудности с обработкой с. Кроме того, вы не должны переименовывать пакеты как часть зависимостей вашего проекта (но часто вы не можете этого знать).
Есть ли у кого-нибудь какие-либо ресурсы, которые они используют?
В общем, вы должны хорошо понимать как Maven управляет зависимостями и использует ресурсы, которые он предлагает (свои инструменты и механизмы). Ниже некоторые важные моменты:
-
dependencyManagement
определенно является точкой входа в этом разделе: здесь вы можете иметь дело с Maven Dependency Mediation, влиять на его решение относительно транзитивных зависимостей, их версий, их возможностей. Один важный момент: то, что вы добавляете вdependencyManagement
, автоматически не добавляется как зависимость.dependencyManagement
учитывается только после того, как определенная зависимость проекта (как указано в файлеpom.xml
или через транзитивные зависимости) имеет соответствие с одной из его записей, иначе оно просто будет проигнорировано. Это важная частьpom.xml
, поскольку она помогает управлять зависимостями и их транзитивными графами и почему часто используется в родительских потах: вы хотите обрабатывать только один и централизованно, какую версию, например,log4j
вы хотите использовать во всех ваших проектах Maven, вы объявляете его в общем/общем родительском pom и егоdependencyManagement
, и вы убедитесь, что он будет использоваться как таковой. Централизация означает лучшее управление и лучшее обслуживание. -
dependency
важнодля объявления зависимостей: обычно вы должны объявлять здесь только прямые зависимости, которые вам нужны. Хорошим правилом thump является: объявить здесь какcompile
(по умолчанию) область действия только тем, что вы фактически используете в качестве оператораimport
в своем коде (но вам часто нужно идти дальше этого, например, драйвер JDBC, необходимый во время выполнения и никогда ссылка в вашем коде, тогда она будет находиться в областиruntime
). Также помните: порядок объявления важен: первая заявленная зависимость выигрывает в случае конфликта с транзитивной зависимостью, следовательно, путем повторного объявления зависимой зависимости вы можете эффективно влиять на посредничество зависимости. - Не используйте
exclusions
в зависимостях для обработки транзитивных зависимостей: используйтеdependencyManagement
и порядокdependencies
для этого, если сможете. Злоупотреблениеexclusions
делает техническое обслуживание намного сложнее, используйте его, только если вам действительно нужно. Кроме того, при добавленииexclusions
всегда добавляйте комментарий XML, объясняющий, почему: ваши товарищи по команде и/или ваши будущие лица будут оценены. - Использовать зависимости
scope
задумчиво. Используйте область по умолчанию (compile
) для того, что вам действительно нужно для компиляции и тестирования (например,loga4j
), используйтеtest
только (и только) для того, что используется в тесте (например,junit
),provided
для того, что уже предусмотрено целевым контейнером (например,servlet-api
), используйте областьruntime
только для того, что вам нужно во время выполнения, но вы никогда не должны компилироваться с ним (например, драйверы JDBC). Не используйте областьsystem
, поскольку она будет только подразумевать проблемы (например, она не упакована с вашим последним артефактом). - Не играйте с диапазонами версий, если только по конкретным причинам и не знаете, что указанная версия минимальные требования по умолчанию, выражение
[<version>]
является самым сильным, но вам редко это нужно. - использовать Maven
property
в качестве заполнителя для2 → элементов семейств библиотек, чтобы убедиться, что у вас есть одно централизованное место для управления версиями набора зависимостей, которые будут иметь все такое же значение версии. Классическим примером может быть свойствоspring.version
илиhibernate.version
для использования для нескольких зависимостей. Опять же, централизация означает лучшее управление и поддержание, что также означает меньшую головную боль и меньше ада. - При условии, импортировать спецификацию в качестве альтернативы вышеприведенной точке и лучше обрабатывать семейства зависимостей ( например jboss), делегируя другому файлу
pom.xml
управление определенным набором зависимостей. - Не использовать (ab)
SNAPSHOT
зависимости (или как можно меньше). Если вам действительно нужно, убедитесь, что вы никогда не освобождаетесь, используяSNAPSHOT
зависимость: встроенная воспроизводимость будет в большой опасности. - При устранении неполадок всегда проверяйте полную иерархию вашего файла
pom.xml
, используяhelp:effective-pom
. быть действительно полезным при проверке эффективныхdependencyManagement
,dependencies
иproperties
в отношении конечного графика зависимостей. - Используйте другие плагины Maven, чтобы помочь вам в управлении.
maven-dependency-plugin
действительно полезен при устранении неполадок, но также помогаетmaven-enforcer-plugin
. Вот несколько примеров, заслуживающих упоминания:
В следующем примере убедитесь, что никто (вы, ваша команда и ваше будущее сами) не сможете добавить известную тестовую библиотеку в область compile
: сборка завершится с ошибкой. Это гарантирует, что junit
никогда не достигнет PROD (в комплекте с вашим war
, например.)
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1<.version>
<executions>
<execution>
<id>enforce-test-scope</id>
<phase>validate</phase>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<bannedDependencies>
<excludes>
<exclude>junit:junit:*:*:compile</exclude>
<exclude>org.mockito:mockito-*:*:*:compile</exclude>
<exclude>org.easymock:easymock*:*:*:compile</exclude>
<exclude>org.powermock:powermock-*:*:*:compile</exclude>
<exclude>org.seleniumhq.selenium:selenium-*:*:*:compile</exclude>
<exclude>org.springframework:spring-test:*:*:compile</exclude>
<exclude>org.hamcrest:hamcrest-all:*:*:compile</exclude>
</excludes>
<message>Test dependencies should be in test scope!</message>
</bannedDependencies>
</rules>
<fail>true</fail>
</configuration>
</execution>
</executions>
</plugin>
Посмотрите на другие стандартные правила, которые предлагает этот плагин: многим может быть полезно сломать сборку в случае неправильных сценариев:
- вы можете запретить зависимость (даже транзитивно), очень удобно во многих случаях
- вы можете сбой в случае
SNAPSHOT
, используемый, удобный в профиле выпуска, в качестве примера.
Опять же, общий родительский pom мог включать более одного из этих механизмов (dependencyManagement
, плагин принудительного запуска, свойства семейств зависимостей) и убедитесь, что соблюдены определенные правила. Вы не можете охватить все возможные сценарии, но это определенно уменьшит степень ада, который вы ощущаете и переживаете.