Создайте веб-приложение и его независимые плагины с помощью maven

У меня есть веб-приложение, которое я назову ядром, в которое могут быть добавлены плагины (а не плагины maven), но оно должно работать и строиться нормально как отдельное веб-приложение. У нас есть библиотека плагинов, от которой зависит ядро ​​и от которой также зависят все плагины, разработанные для ядра.

Нравится:

core    -> core-plugin-lib
plugins -> core-plugin-lib

Моя структура каталогов проста:

root/
    core/
        pom.xml
    core-plugin-lib/
        pom.xml
    pluginA/
        pom.xml
    pluginB/
        pom.xml

Моя первая проблема: могу ли я собрать ядро ​​или любой плагин, а также построить зависимую библиотеку? Я читал о модулях, но, как видите, у библиотеки 2 родителей. Что мне действительно нужно, так это собрать ядро, а также создать библиотеку. ИЛИ, если я построю какой-либо плагин, я также хотел бы построить библиотеку независимо. И помните также, что ядро ​​не зависит от какого-либо плагина.

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

На данный момент, когда я создаю плагин, он копирует себя в каталог / plugin внутри ядра, и у меня есть профиль распространения в основном pom, чтобы скопировать существующие плагины из этого каталога во внутреннюю войну веб-приложения. Поэтому, когда я создаю ядро ​​без профиля, оно не копирует свои плагины, но когда я запускаю профиль распространения, да. Это работает, но утомительно, так как мне нужно собрать библиотеку, собрать плагины и собрать ядро.

Я хотел бы знать, есть ли какая-либо структура pom, которая могла бы решить двойную зависимость моей первой проблемы, и есть ли способ справиться со второй проблемой и создать плагины через ядро, даже если они не зависят. И, если возможно, если бы я мог справиться со второй проблемой в профиле вместо отдельного pom. Этот профиль использует maven-assembly-plugin для создания tar .gz со всем упакованным в него. Я бы тоже хотел это сохранить, если возможно.


person Rafael Raposo    schedule 15.09.2011    source источник


Ответы (1)


Я читал о модулях, но, как видите, у библиотеки 2 родителя.

Я думаю, вы имеете в виду, что в библиотеке есть 2 проекта, которые зависят от нее. Родитель означает что-то конкретное в Maven: POM, который наследуется другим. В этом случае я думаю, что модули - это то, что вы ищете.

Что касается того, можете ли вы собрать библиотеку с ядром и плагинами, то да, это возможно. Это хорошая идея? Я бы сказал, нет. Библиотека плагина определяет контракт между плагинами и ядром. Как правило, вы хотите знать точно, какая версия у вас установлена, и не обязательно всегда последней. Я бы порекомендовал вам сохранить версию библиотеки независимой от других проектов и при необходимости построить ее. Затем позвольте вашему ядру и плагинам зависеть от версии в локальном (или удаленном) репозитории, на который вы нацеливаетесь.

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

Что касается второго вопроса, вы, безусловно, можете определить отдельный POM, который объединяет как ядро, так и плагины. Используйте ту же многомодульную технику.

person Mac    schedule 15.09.2011
comment
Спасибо, Мак, но не знаю, все ли я понял. во всяком случае, мне понравились ваши советы по версиям. Второй вопрос: как мне определить pom, который будет собираться как для локального развертывания, так и для тестирования, а другой, например, для распространения? Должен ли я использовать для этого профили или мне нужно иметь два отдельных POM для каждого сценария? Я видел, что родительский pom должен иметь упаковку pom, поэтому должен ли я создать отдельный профиль для этого родительского pom в отношении maven-assembly-plugin для распространения? - person Rafael Raposo; 16.09.2011
comment
Да, профили - это механизм для изменения сборки в зависимости от среды или цели. Обычно у вас есть ресурсы с $ {replace.values}, которые фильтруются на этапе process-resources. Не уверен, что понимаю ваш последний вопрос, но я думаю, что вы в основном правы. Родительский POM может быть многомодульным POM, хотя это тоже может быть не очень хорошей идеей (не очень хорошо работает для наших проектов). Если бы это был я, я бы оставил родительский POM строго для общих зависимостей, конфигурации сборки и т. Д. И поместил многомодульный POM рядом с другими. У них тоже могут быть профили. - person Mac; 16.09.2011
comment
Спасибо, Mac, я решил это, создав многомодульный pom с ядром и плагинами в виде модулей, как вы предложили, и используя активацию по свойствам для каждого сценария локального развертывания и упаковки распространения. К сожалению, я не могу активировать профили через внутренние свойства pom, только через свойства командной строки, но у нас не может быть всего;) - person Rafael Raposo; 17.09.2011