Comment puis-je configurer maven sous-projets avec les inter-dépendances?

Je vais avoir un moment difficile de la configuration d'un ensemble de projets maven avec les interdépendances entre eux.

Voici mon cas simplifié:

pom.xml     -- parent pom
\base\
    pom.xml
    src\main\java\Base.java     -- this is just a simple class
\derived\
    pom.xml
    src\main\java\Derived.java  -- this is a simple class that needs Base class to compile successfully, and has a main function

Mes objectifs sont:

  1. être en mesure de compiler, sur ma machine, tous les projets:
    • c'est à dire mnv clean compile est couronnée de succès dans \
  2. être en mesure de compiler, sur ma machine, un seul projet:
    • c'est à dire mnv clean compile est couronnée de succès dans \base\ et \dérivée de\ (même si cela peut ne pas fonctionner par la conception: Inter les Dépendances d'un Projet avec Maven)

      [edit: trouvé la réponse pour celle-ci: la base doit être publié localement avant de dérivés dans compilé: c'est à dire dans \base, ne mvn clean compile install au lieu de faire juste faire mvn clean compile. Une fois cela fait, faire mvn clean compile dans \dérivés fonctionne très bien. Pourtant, il serait bien de le faire sans toucher à l'état global, c'est à dire sans avoir à installer de base -- donc, si quelqu'un connait un moyen d'y parvenir, veuillez l'ajouter comme une réponse]

  3. être en mesure d'exécuter dérivés projet sur ma machine (mvn exec:exécuter ou équivalent) directement à partir de l'arbre source:
    • c'est à dire mvn exec:run dans \dérivé\ compiler (si nécessaire) et d'exécuter la derived.jar
  4. le "composant partagé" cas d'utilisation: pousser la base de l'artefact à l'espace de stockage partagé, où d'autres personnes peuvent consommer comme une dépendance maven (c'est à dire moment de la compilation de la dépendance):
    • c'est à dire mvn clean compile ??? va le pousser à l'espace de stockage partagé spécifié dans ~/.m2/config.xml
  5. le "répertoire de l'image" cas d'utilisation: pousser la dérivée de l'artefact et son depedencies à un répertoire local, où il peut être exécuté par l'intermédiaire de "java-jar ..." ou il peut exposée comme un serveur ftp/http partager pour que d'autres personnes l'obtenir. I. e., l'utilisation des cas comme ceux-ci:
    • mvn clean compile ??? va pousser derived.jar et les dépendances (comme base.jar) dans ~/.m2/maven.repo/.../dérivés ou l'équivalent, et puis je peux cd ~/.m2/maven.repo/.../dérivés et exécuter java -jar derived.jar pour l'exécuter.
    • mvn clean compile ??? va pousser base.jar dans ~/.m2/maven.repo/.../de base (ou derived.jar à son correspondant dir), qui est déjà exposé en téléchargement via le web ou un serveur ftp.

Comment dois-je faire les objectifs ci-dessus?

Voici la section pertinente du parent pom:

...
<modelVersion>4.0.0</modelVersion>
<groupId>com.foo</groupId>
<artifactId>parentpom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<name>parentpom</name>

<modules>
    <module>base</module>
    <module>derived</module>
</modules>
...

Voici la section pertinente de la base pom.xml:

...
<parent>
    <groupId>com.foo</groupId>
    <artifactId>parentpom</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<modelVersion>4.0.0</modelVersion>
<groupId>com.foo.base</groupId>
<artifactId>base</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>base</name>
...

Voici la section pertinente de dérivés pom.xml:

...
<parent>
    <groupId>com.foo</groupId>
    <artifactId>parentpom</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<modelVersion>4.0.0</modelVersion>
<groupId>com.foo.derived</groupId>
<artifactId>derived</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>derived</name>

<dependencies>
    <dependency>
        <groupId>com.foo</groupId>
        <artifactId>base</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

...

Je vous remercie d'avance pour votre aide.

Juste pour préciser, qu'est-ce exactement ne fonctionne pas dans le cas de (1)?
La raison principale pour (1) c'était une appellation d'incohérence dans mon maven configuration: au lieu d'utiliser partout FooColorBlack, j'ai parfois repris les pièces à FooBlackColor (exemple, pas de vrais noms).
Voici un exemple de projet explique: maven.apache.org/guides/mini/guide-multiple-modules.html

OriginalL'auteur daniel | 2012-08-31