управление зависимостью со знатоком

Я в последнее время стал большим поклонником Знатока для управления циклом сборки для моего приложения. Однако я встретился с некоторыми грубыми краями с управлением зависимостью Знатока. Я задаюсь вопросом, ли это ограничения инструмента и парадигмы, необходимого зла управления зависимостью, или если я "m просто с помощью инструмента неправильно.

  1. Сначала вопрос переходных зависимостей. Насколько я понимаю, если Вы обеспечите зависимость, то Знаток в свою очередь найдет любые зависимости той зависимости. Это является большим, но для многих моих зависимостей, это не работало. Например, включая В спящем режиме в моем проекте:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>3.3.2.GA</version>
    </dependency>
    

    Результаты в недостающей зависимости slf4j. Я должен вручную добавить эту зависимость, которую я принял, будет задание Знатока. То же идет для Spring. Если я добавляю Spring-MVC как зависимость, не были должны, все основные зависимости от сервлета добавляются для меня (потому что Spring-MVC был бы нужен этот материал)? Я обращаюсь к сервлету, jsp, jstl библиотеки.

  2. Второй управление репозиториями. Знаток приезжает поставленный с основным репозиторием по умолчанию, но я нашел, что во многих случаях этот репозиторий не актуален. Например, ifyou хотят spring3, необходимо вручную добавить springsource репозиторий, и если Вы хотите, в спящем режиме 3.5 +, необходимо добавить jboss репозиторий. Это, кажется, побеждает точку автоматического управления зависимостью, когда необходимо выследить корректные репозитории сами. Этот поиск скоро является сложным. Например, для добавления Spring3 можно хотеть пружинный выпуск repo, пружинный внешний облик repo и пружинный этап repo.

  3. Тесно связанный с номером 2 гарантирует, чтобы у Вас была правильная версия артефакта. Я несколько раз записывался включением неверных версий зависимых артефактов для данного артефакта. Например, неверная версия servlet/jsp/jstl пчелы для spring3 или неверная версия персистентности / пчела аннотации для в спящем режиме. Репозитории заполнены многими версиями, некоторыми с запутывающими именами как productx-3.ga, productx-3-rc1, productx-3-SNAPSHOT, productx-3-cr, product-3-beta, и т.д. Некоторые из них очевидны (дистанционное управление = предвыпускная версия), но это может путать попытку определить порядок этих версий.

  4. Наконец, проблема типа зависимость. Я, вероятно, просто не понимаю это достаточно хорошо, но много repo артефактов имеют тип "англичанин" не "банка". Несколько раз я добавлял банку зависимости к своему проекту только, чтобы узнать во время изготовления, что repo банка на самом деле не существует (примером является org.hibernate ejb3-персистентность в jboss repo).

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

9
задан Pascal Thivent 8 January 2010 в 15:36
поделиться

3 ответа

Не могу ответить на все части вопроса, но о некоторых из них:

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

  • Центральный репозиторий Maven содержит только выпуски. Следовательно, он не содержит Hibernate 3.5 (который является бета-версией), а также не содержал Spring 3 до его выпуска (кстати, вам больше не нужно указывать специальный репозиторий Spring для Spring 3 - выпуск уже есть в Maven Central)

  • slf4j - это особый вид зависимости - его поведение во время выполнения зависит от того, какую реализацию slf4j вы используете. Следовательно, для управления его поведением вы должны явно указать реализацию slf4j

  • О навыках управления: чтобы получить полезную информацию для поддержки вашего pom.xml , вы можете использовать mvn dependency: tree ( особенно с -Dverbose = true ) и mvn dependency: analysis . Также может быть полезно проверить файл pom вашей зависимости, чтобы найти дополнительные зависимости.

14
ответ дан 4 December 2019 в 11:42
поделиться

Вы также можете исключить некоторые транзитивные зависимости, такие как следующий пример:

<dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.15</version>
        <exclusions>
            <exclusion>
                <groupId>javax.mail</groupId>
                <artifactId>mail</artifactId>
            </exclusion>
            <exclusion>
                <groupId>javax.jms</groupId>
                <artifactId>jms</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.sun.jdmk</groupId>
                <artifactId>jmxtools</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.sun.jmx</groupId>
                <artifactId>jmxri</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

Я не помню детали, но, по-видимому, некоторые другие зависимости были обнаружены, когда мы хотели использовать Log4J, и у нас не было интереса (или не нужно В них в нашем случае, поэтому моя корона Оркер только что сказала «Нет, благодаря этим», и это работает.

1
ответ дан 4 December 2019 в 11:42
поделиться

Во-первых, вопрос транзитивных зависимостей. Насколько я понимаю, если вы предоставляете зависимость, Maven в свою очередь найдет какие-либо зависимости этой зависимости. Это здорово, но для многих моих зависимостей это не сработало. (...)

Как уже указывалось, некоторые зависимости могут быть отмечены как необязательно (и не тянутся транзитивно). Идея состоит в том, что некоторые зависимости используются только для определенных функций и не будут необходимы, если эта функция не используется. Если пользователь хочет использовать функциональные возможности, связанные с дополнительной зависимостью, им придется Redeclare, что необязательная зависимость в собственном проекте. Так что это просто работает как разработано :)

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

Даже если идея концепции Central Refo благородна, вы не можете объективно ожидать, что он содержит все банки в мире. Одной из наиболее очевидных причин является то, что загрузка артефактов в центральный репозиторий просто требует времени, а ресурсы не бесконечны. И поскольку компании, как Redhat Jboss или Springsource или Sun или даже мне нужна гибкость, реакционная способность (в одном слове, контроль), не удивительно, что они используют свой собственный репозиторий. И на самом деле, я довольно рад, что они подвергают их. Но действительно, проекты должны документировать, где найти свои артефакты, если они не доступны в центральном . На всякий случай, вы можете найти это Как найти зависимости на публичных репозиториях Maven? полезно. В корпоративной среде лучший способ справиться с этим, будет настроить централизованный (корпоративный) прокси-репозиторий. См. Эта страница для таких решений.

Тесно, связанные с номером 2, обеспечивающим правильную версию артефакта. (...)

Извините, но вам нужно немного знать, что вы делаете. Проект не может угадать для вас, какую версию JSTL вы собираетесь использовать. Затем, касающимся различных версий артефактов, Конвенция об именах, используемая проектами, не имеет ничего общего с Maven, это выбор проекта / поставщика (за исключением снимка, который обрабатывает мавена специально). FWIW, общие использованные схемы включают в себя: M1 = Milestone 1, RC1 = Commentiдент 1, GA = Общая доступность (окончательный выпуск), CR = выпуск клиента (часто выпуск исправления ошибок). Вы также можете увидеть альфа, бета. Это действительно зависит от жизненного цикла и конвенции проекта (здесь ничего не очень необычно).

Наконец, проблема типа зависимости. Я, наверное, просто не понимаю этого достаточно хорошо, но многие артефакты Reppo имеют тип «POM», а не «банку». (...)

Я думаю, что вы действительно не хватаете опыта. Кажется, вы боретесь с зависимостями, в то время как все просто проходят плавно для меня :) Может быть, используя поисковую систему .

3
ответ дан 4 December 2019 в 11:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: