Отличный пример того, как много зависит от знаний технологий.
Как найти оптимальное решение в этом море IT? Самые лучшие головы (себя не имею в виду) изобретают костыли и велосипеды на теугольных колесах когда уже с 2008-09-23 есть готовое решение:
maven-reactor-plugin

Остальная часть: мои прежние костыли для решение этой проблемы.

Делаем структура многомодульного проекта как показано ниже:
+++ Root +++ Base pom.xml (рутовый pom) +++ SubProject1 pom.xml <parent> <artifactId>Base</artifactId> <relativePath>../Base/pom.xml</relativePath> ... </parent> +++ SubProject2 +++ SubBase2 pom.xml <parent> <artifactId>Base</artifactId> <relativePath>../../Base/pom.xml</relativePath> ... </parent> +++ SubProject21 pom.xml <parent> <artifactId>SubBase2</artifactId> <relativePath>../SubBase2/pom.xml</relativePath> ... </parent> +++ SubProject22 +++ SubProject23

таким образом для сборки например подпроекта SubProject21 нам не надо синхронизироваться по каталогу Root, где может содержаться большое число подпроектов, а только несколько подкаталогов:

Root/Base,
Root/SubProject2/SubBase2,
Root/SubProject2/SubProject21

Разрешение зависимостей

Теперь предствавим, что SubProject22 зависит от SubProject21. Если мы не хотим собирать весь весь проект мы должны помнить все зависимости и собирать подпроекты в определенном порядке (как это делает pom c включенными в него модулями) Автоматически разрешать зависимости можно старым добрым ant:

build.xml для подпроекта SubProject2 кладем в SubBase2:
<project default="SubProject2_all"> <condition property="maven.executable" value="mvn.bat"> <os family="windows"/> </condition> <property name="maven.executable" value="mvn"/> <property name="target" value="clean install"/> <property name="fastTarget" value="install -DskipTests=true"/> <target name="SubProject2_all"> <exec dir=".." executable="${maven.executable}" failonerror="true"> <arg line="${target}"/> </exec> </target> <target name="SubProject2_clean"> <exec dir=".." executable="${maven.executable}" failonerror="true"> <arg line="clean"/> </exec> </target> <target name="SubBase2"> <exec dir="." executable="${maven.executable}" failonerror="true"> <arg line="${target}"/> </exec> </target> <target name="fastSubBase2"> <exec dir="." executable="${maven.executable}" failonerror="true"> <arg line="${fastTarget}"/> </exec> </target> <target name="SubProject21" depends="SubBase2"> <exec dir="../SubProject21" executable="${maven.executable}" failonerror="true"> <arg line="${target}"/> </exec> </target> <target name="fastSubProject21" depends="fastSubBase2"> <exec dir="../CommonServices/DataProcessing" executable="${maven.executable}" failonerror="true"> <arg line="${fastTarget}"/> </exec> </target> <target name="SubProject22" depends="SubProject21"> <exec dir="../SubProject21" executable="${maven.executable}" failonerror="true"> <arg line="${target}"/> </exec> </target> <target name="fastSubProject22" depends="fastSubProject21"> <exec dir="../CommonServices/DataProcessing" executable="${maven.executable}" failonerror="true"> <arg line="${fastTarget}"/> </exec> </target> ...