Состав многомодульного проекта Maven относительно совместного использования зависимостей

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

Проект из 8-11 дочерних проектов, имеющий родительский артефакт / проект и один основной проект, который в основном использует / объявляет эти другие как модули.

Проблема в том, что все проекты "строго" разделяют только общие зависимости, например testng, logging, apache commons and stuff. Но всегда, как и 3 из них, используют 50-60% одних и тех же конкретных зависимостей (apache-chemistry, jackrabbit, abdera и т. Д.), Еще 2-3 из них также используют 50-60% одинаковых, но разных зависимостей. . И главный использует много таких же глубин.

Я не могу поместить эти «нестрогие» общие зависимости в родительский проект, чтобы другие унаследовали их. Так что наследуются только общие deps. И существует множество повторяющихся зависимостей. А управлять их версиями я могу только через <dependencyManagement>.

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

У меня могло быть больше одного родительского проекта, но это нехорошо. Также наследование от родительского проекта может быть кошмаром, потому что вы не знаете, какие зависимости нужны проекту, если вы не документируете / не комментируете определение родительского pom должным образом.

Другой способ - создать pom-артефакты, которые служат только в качестве контейнеров зависимостей - они объявляют определенные группы зависимостей, так что модули просто объявляют их для получения транзитивных зависимостей. Но послушайте, вы бы хотели развернуть и зафиксировать какой-нибудь

OneDepArtifact объявляет jackrabit, abdera, chemistry

ДругойDepArtifact объявляет htmlcleaner, google-api, tika

ThirdDepArtifact, объявляющий spring, httpclient, selenium

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

Я подумывал адаптировать разработку своего приложения к «многомодульному дизайну maven». Но если вы хотите создать службы / бины Spring, которые просто используют различные библиотеки в одном модуле, вы не реализуете их в другом модуле только потому, что они используют библиотеку, которую также использует другой модуль :-)


person lisak    schedule 14.06.2011    source источник
comment
У меня точно такая же проблема. Мне нравится управлять многомодульным проектом из-за других преимуществ, которые он дает, но совместное использование зависимостей между модулями становится кошмаром, если проект становится большим.   -  person lisak    schedule 14.06.2011
comment
Может быть, нужно адаптировать фактическую разработку приложения к дизайну многомодульного проекта и попытаться создать такие компоненты, чтобы не было повторного использования зависимостей ... Но это не кажется правильным   -  person lisak    schedule 14.06.2011


Ответы (3)


Maven 3.1 должен решить эту проблему, введя «миксины». Между тем, похоже, что я могу получить большинство необходимых функций за счет правильного использования профилей, как я описал в этом сообщении в блоге:

http://weblogs.java.net/blog/fabriziogiudici/archive/2011/07/19/maven-pom-composition-means-profiles

Пожалуйста, дайте мне знать, найдете ли вы это полезным.

person Fabrizio Giudici    schedule 19.07.2011

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

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

Некоторые вещи, которые помогут вам держать вещи организованными и разумными ...

  • Используйте хорошие соглашения об именах; не вызывайте только родительские проекты parent1 и parent2. Используйте имена, которые описывают, какие зависимости и другие параметры они настраивают, чтобы людям было интуитивно понятно, что и когда использовать.
  • Используйте функцию выпуска / развертывания maven, чтобы они правильно управлялись версиями в вашем репо и всегда ссылались на артефакты фиксированной версии. Отказ от использования снимков SNAPSHOT - это первый шаг к созданию детерминированных воспроизводимых сборок. Отлаживать проблемы, когда что-то меняется на лету, очень сложно.
  • Не полагайтесь на файл pom.xml, чтобы узнать, какие зависимости нужны вашему проекту. Это поможет вам избежать наследования и других вещей, таких как настраиваемые профили. Для выполнения этих аналитических задач следует использовать maven-dependency-plugin. Существуют такие команды, как mvn dependency:tree, показывающая все зависимости проекта, и mvn dependency:analyze, показывающая неиспользуемые зависимости.

Надеюсь, с этим советом наследование родительского файла POM не будет казаться таким сложным и кошмарным. Удачи!

person Jesse Webb    schedule 14.06.2011
comment
У меня просто родительский каталог / pom (наследуется от SuperPom и объединяет все 10 модулей) и модуль dirs / pom на том же уровне. Модули наследуются от родителя и являются его модулями. Однако я уже все делаю так, как вы предлагаете. Я считаю, что просто должен принять это как есть. Я не хочу связывать наследование с 3 суб-родителями ... Я бы предпочел, чтобы все модули объявляли все эти повторяющиеся зависимости в многомодульном проекте - person lisak; 15.06.2011
comment
@lisak - Почему вы предпочли бы повторно объявить все повторяющиеся зависимости вместо использования наследования? Кроме того, вам следует попробовать сделать родительский pom ОТЛИЧНЫМ от pom агрегатора. По моему опыту, это всегда упрощает задачу. Я описываю этот макет в ответе, на который ссылался. - person Jesse Webb; 15.06.2011
comment
Если совместное использование зависимостей является единственным аспектом, который делает модули братьев и сестер, наследование цепочки является избыточным. Если есть еще какие-то плагины или вещи фазы сборки, которые нужно унаследовать, почему бы и нет. Но в остальном мне легче работать. Также трудно отслеживать неиспользуемые объявленные зависимости времени выполнения / тестирования, которые перечислены в dependency: analysis ... просто мне все равно, использую я его или нет, возможно, это основная проблема, наличие этой функции не приносит никаких облегчение мне в этом случае :-) - person lisak; 15.06.2011

Если это в основном управление версией (номером) - почему бы не указать только версию зависимости как свойство в родительском проекте и не использовать ее в дочерних проектах, например

Родитель

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>foo.bar</groupId>
    <artifactId>maven-parent</artifactId>
    <version>0.0.1</version>
    <packaging>pom</packaging>

    <properties>
        <log4j.version>1.2.16</log4j.version>
    </properties>

</project>

Ребенок

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>maven-parent</artifactId>
        <groupId>foo.bar</groupId>
        <version>0.0.1</version>
    </parent>

    <groupId>foo.bar</groupId>
    <artifactId>maven-child</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
    </dependencies>

</project>

Это простое решение, позволяющее указать конкретные зависимости проекта с согласованными номерами версий.

person FrVaBe    schedule 14.06.2011
comment
Речь идет совсем не о контроле версий, это единственное, для чего подходит ‹dependencyManagement› ... У меня нет проблем с адом версий, в отличие от других ... Я упомянул об этом в вопросе, что это единственное что у меня под контролем ... Я комбинирую свойства с dependencyManagement в зависимости от того, что унаследовано, а что нет - person lisak; 14.06.2011
comment
Проблема заключается в количестве и дублировании зависимостей во всех этих помахах, даже если у вас есть версии под контролем, их просто очень сложно поддерживать в большом проекте. - person lisak; 15.06.2011