Опубликовать бомбу из мультимодульного проекта

Мы большая компания с около 2000 отдельными проектами Java. По историческим причинам у нас нет многомодульных проектов, но мы бы хотели их представить.

По логике вещей, у нас уже есть "группы" проектов, то есть кто-то, кто отвечает (скажем) за 50 проектов, которые тесно связаны. Этот кто-то регулярно публикует спецификацию, которая содержит последние, последовательные версии этих 50 проектов.

Теперь имеет смысл собрать эти 50 проектов и объединить их в один большой многомодульный проект. Тем не менее, было бы необходимо опубликовать спецификацию, потому что другие проекты (за пределами нашей группы) должны иметь согласованные версии.

Итак, в итоге нам нужна спецификация, которая содержит версии всех 50 проектов, которые являются частью многомодульного проекта. Интересно, каким будет "Maven way" для создания такой спецификации. Что я могу думать о:

  • Бом - 51-й проект мультимодульного проекта. Версии зависимостей задаются свойствами в родительском pom.
  • Бом генерируется из информации, представленной в многомодульном проекте, и публикуется как побочный артефакт (для этого, вероятно, потребуется написать плагин Maven).

Что было бы желательно?

2 ответа

Решение

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

Спецификация обновляется только тогда, когда наш процесс управления выпуском завершает доставку встроенного модуля (или группы модулей): после доставки спецификация обновляется и передается в Nexus (сохраняется как версия 1.0-SNAPSHOT, постоянно перезаписывается после каждой доставки)

Затем эта спецификация включается в нашу POM (для моно- или многомодульных проектов) и используется только для управления зависимостями, что означает, что наши проекты зависят от артефакта без версии: управление зависимостями из спецификации предоставляет самую последнюю версию других зависимых модулей.,

Другими словами, мы отделяем аспект сборки (выполненный здесь с maven) от части выпуска: "ведомости материалов" представляют то, что было доставлено, и гарантируем, что все проекты создаются с версиями, которые, как считается, работают хорошо вместе (так как они были доставлены). в производство вместе).

Я никогда не видел 2K коммерческих Java-проектов, поэтому мой ответ будет основан на том, как работает open source:

  • Библиотеки не должны быть сгруппированы по людям - они должны быть сгруппированы по проблемам, которые они решают. Часто проекты с открытым исходным кодом имеют несколько библиотек, например, Джексон jackson-databind, jackson-datatype-jsr310и т.д. Эти библиотеки тесно связаны друг с другом и могут зависеть друг от друга.
  • Такие группы не должны быть слишком большими. Некоторые проекты могут иметь 1, другие - 5 или 10. 50 libs в группе звучат слишком много.
  • Проще, если библиотеки в группе выпущены одновременно (даже если обновлена ​​только одна). Это позволяет легко отслеживать версии в приложениях, которые используют несколько библиотек из группы.
  • Не должно быть никаких зависимостей между группами! И это, наверное, самое важное правило. Глубокая иерархия библиотек, которые зависят друг от друга, неприемлема, потому что теперь вам нужно сохранять совместимость между многими проектами и библиотеками. Это просто не масштабируется. Это означает, что между библиотеками будет случайный код для копирования - это меньшее зло.
  • Из последнего правила могут быть некоторые исключения (может быть, библиотека, которая используется повсеместно), но они должны сохранять обратную совместимость публичного API, пока не появятся проекты, которые зависят от старого API. Такие библиотеки очень трудно поддерживать, и их лучше открывать.

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

  • Вы можете посмотреть на <scope>import</scope> который позволяет импортировать <dependencyManagement> разделы из других файлов POM, таких как родительские POM в группе (по какой-то причине у меня никогда не работало).
  • Или в xxx-all modules - модуль, который зависит от всех других модулей в группе, и поэтому, когда вы зависите от него, вы также зависите от других транзитивно.
Другие вопросы по тегам