Как включить родительский проект Spring (используя подмодуль Git)? - PullRequest
2 голосов
/ 25 февраля 2010

В настоящее время я разрабатываю несколько веб-приложений с использованием Spring. Я использую Maven для сборки и Git для контроля версий. В данный момент я пытаюсь найти способ разделить разработку некоторых вещей, используемых всеми веб-приложениями, например, У меня есть несколько вспомогательных классов, которые одинаковы для всех проектов. Проблема в том, что я не хочу использовать только классы, но также файлы ресурсов и какой-то родительский POM, хотя все еще независим от репозитория и могу извлечь выгоду из Git.

Хотя я не в восторге от изменения системы сборки, я не настоящий фанат Maven. Особенно концепция наследования и агрегации - вот что меня сейчас сдерживает. Может быть, плющ вариант?

Я бы хотел дать вам краткий обзор моих настроек:

Существует некоторый родительский проект, включающий некоторые классы, файлы конфигурации Spring и другие ресурсы, такие как шаблоны, изображения и таблицы стилей. Давайте назовем это base. Это не полное весеннее веб-приложение, и оно не будет развернуто. Есть несколько других проектов, которые наследуют от base и должны быть упакованы в WAR. Давайте назовем их webapp1 и webapp2.

base, webapp1 и webapp2 имеют свои собственные репозитории Git:

\
 |
 |- base.git       (base's repository)
 |
 |- webapp1.git    (webapp1's repository)
 | \
 |   base          (base used as a Git submodule)
 |
 |- webapp2.git    (webapp2's repository)
   \
     base          (base used as a Git submodule)

Я хочу иметь возможность изменять код base s внутри веб-приложений с помощью подмодуля Git, а также иметь возможность создавать полнофункциональный WAR каждого веб-приложения, используя mvn package в каталоге веб-приложения.

Maven parent или module не допускают такого динамического подхода. Я не нашел способа использовать module подобным образом, и использование parent для моих нужд является сложным и статичным: каждое изменение в base потребовало бы загрузки новой версии в репозиторий, чтобы веб-приложение может наследовать от него.

Может быть, я не до конца понял наследство Мавена, но сейчас я довольно растерян.

Кто-нибудь добился чего-то подобного с успехом? Какую систему сборки вы использовали и как?

Ответы [ 2 ]

0 голосов
/ 04 марта 2010

Я нашел рабочее решение самостоятельно.

Основным решением моей проблемы является небольшой подэлемент элемента <parent>, называемый <relativePath>. Это позволяет искать родительский POM в указанном каталоге. В противном случае вам всегда нужно будет развернуть новую версию, прежде чем вы сможете протестировать ее в своем приложении.

<parent>
    <groupId>com.example</groupId>
    <artifactId>base</groupId>
    <version>1.0.0</groupId>
    <relativePath>base</relativePath>
</parent>

Но это была только отправная точка, позволяющая работать с подмодулем Git. Чтобы это действительно заработало, мне нужно было сделать следующее:

  • Создайте WAR с классами и ресурсами из обоих веб-приложений и base, то есть всех файлов внутри

    base/src/main/java
    base/src/main/resources
    base/src/main/webapp
    src/main/java
    src/main/resources
    src/main/webapp
    

    Несмотря на то, что ресурсы довольно легко охватить, для ввода ресурсов веб-приложения в WAR требуется немного конфигурации для org.apache.maven.plugin:maven-war-plugin. Для компиляции двух разных исходных папок требуется плагин, поэтому мне нужно использовать org.codehaus.mojo:build-helper-maven-plugin, чтобы получить классы base в WAR.

  • Кроме того, я использовал много фильтрации для ресурсов, поэтому почти не нужно настраивать основные файлы для запуска и запуска веб-приложения. Например, я использую ${project.artifactId} внутри моего основного файла шаблона, поэтому мой HTML <head> будет выглядеть примерно так для веб-приложения под названием webapp1:

    <link href="stylesheets/base.css" rel="stylesheet" media="screen" type="text/css" />
    <link href="stylesheets/webapp1.css" rel="stylesheet" media="screen" type="text/css" />
    

Это действительно потребовало много проб и ошибок, но, наконец, я заработал, и я думаю, что это лучший способ для достижения моей цели с помощью Maven. Это было бы намного проще с использованием динамического инструмента, такого как Buildr , но, к сожалению, Buildr работает медленно в Windows (благодаря Ruby) и не очень хорошо интегрируется в большинство IDE.

0 голосов
/ 25 февраля 2010

Ваш вариант использования является хорошим вариантом для оверлеев (также посмотрите в примерах ).

Оверлеи используются для совместного использования общих ресурсов в нескольких веб-приложениях. В общем, все зависимости проекта WAR собраны в WEB-INF / lib, за исключением артефактов WAR, которые накладываются на источник WAR.

Но base не будет "под" модулем веб-приложения, скорее всего, это будет родственный модуль (может быть, он может быть "в" веб-приложении с использованием некоторой черной магии Git, но это выходит за рамки Навыки Git, и я не могу придумать, как это можно сделать с Maven). Нет, правда, я думаю, что Maven мог бы использовать оверлеи. И если это не то, что вы хотите, лучше использовать что-то еще, чем Maven IMO.

...