web-dev-qa-db-fra.com

Modules Maven et dépendants

Des collègues ont vanté les merveilles de Maven et ses dépendances magiques, mais je trouve qu'il échoue à ce que je considérerais comme l'utilisation évidente.

Supposons que j'ai un dossier racine avec un POM maître.

Ensuite, en dessous, j'ai quelques projets, appelez-les A et B

B nécessite A et donc le POM dans le dossier B contient l'entrée de dépendance appropriée

Maintenant, de retour dans le dossier racine, dans un profil, je précise que je veux construire B.

Lorsque j'effectue l'installation propre habituelle de mvn, j'obtiens un échec car A n'a pas été créé.

Mes amis me disent que je dois spécifier A et B dans ce profil principal à la racine.

Mais ce n'est pas tout le point de la gestion des dépendances que maven voit B, va dans le fichier B POM où il voit la dépendance sur A et donc il devrait aller construire A automatiquement.

50
David

Une raison pour laquelle je peux penser que votre comportement souhaité n'a pas été mis en œuvre est la suivante:

Supposons que je travaille sur les deux projets A et B. Actuellement, A est cassé. Si la résolution des dépendances s'est produite comme vous le souhaitez, je ne serais jamais en mesure de construire B tant que A n'a pas été corrigé. Je dois donc soit annuler mes modifications sur A, soit me concentrer sur la correction de A en premier. Quoi qu'il en soit, ce n'est peut-être pas ce sur quoi je veux me concentrer en ce moment.

Généralement, B veut travailler avec la "dernière bonne" version de A, plutôt qu'avec la dernière. L'utilisation des dépendances du référentiel signifie qu'elles ont au moins compilé correctement (et j'espère que les tests unitaires ont également été exécutés).

25
Rich Seller

Avec le maître POM:

~/scratch/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>scratch</groupId>
    <artifactId>scratch</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <modules>
        <module>nipple</module>
        <module>cabbage</module>
    </modules>
</project>

Et les modules POM:

~/scratch/nipple/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">

    <parent>
        <artifactId>scratch</artifactId>
        <groupId>scratch</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <groupId>scratch</groupId>
    <artifactId>nipple</artifactId>
    <version>1.0-SNAPSHOT</version>

</project>

~/scratch/cabbage/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">

    <parent>
        <artifactId>scratch</artifactId>
        <groupId>scratch</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <groupId>scratch</groupId>
    <artifactId>cabbage</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>scratch</groupId>
            <artifactId>nipple</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

Je peux émettre mvn package dans le répertoire racine après avoir vidé mon référentiel local et fini avec tous les modules construits. (Dans des fichiers JAR vides, mais intégrés.)

Maven semble rechercher des dépendances soit dans le référentiel, soit dans le build en cours. Il ne traversera pas automatiquement la structure de votre projet lorsque vous ne construisez qu'un seul module, car il n'est pas nécessaire que vous ayez même le projet parent sur votre ordinateur, et encore moins un répertoire au-dessus du module actuel. (La relation parent-enfant n'est même pas bijective.)

Une raison pourrait en être ainsi car une disposition de répertoire où l'emplacement des modules serait prévisible n'est en aucun cas obligatoire. Il est même quelque peu courant et acceptable que la disposition de l'exemple ci-dessus soit la suivante:

projects
|
+--scratch
|  |
|  +--scratch-parent
|  |  |
|  |  +--pom.xml [The POM of scratch:scratch:1.0-SNAPSHOT]
|  |
|  +--nipple
|  |  |
|  |  +--pom.xml [The POM of scratch:mod1:1.0-SNAPSHOT]
|  |
|  +--cabbage
|  |  |
|  |  +--pom.xml [The POM of scratch:mod2:1.0-SNAPSHOT]

Dans ce cas, le <modules> la section du POM parent serait:

<modules>
    <module>../nipple</module>
    <module>../cabbage</module>
</modules>

Notez qu'il n'y a rien qui dit quel ID d'artefact se trouve dans quel module. Il sert simplement à indiquer à Maven qu'il s'agit d'emplacements de système de fichiers où rechercher d'autres artefacts liés à cette version.

42
millimoose

Jetez un œil au plugin de réacteur Maven , en particulier réacteur: make, qui construit un module et tous les modules dont il dépend.

14
deterb

Rich a tout à fait raison. Ce que vous décrivez n'est généralement pas le comportement attendu. Bien que, comme indiqué par deterb, le réacteur Maven supporte les builds partiels si les modules sont connus par le POM parent .

Construire avec mvn install -pl B -am devrait également faire (-am) Les dépendances de B (c'est-à-dire A).

Quoi qu'il en soit, le module A doit être un module du POM parent.

(voir Modules Maven + Construction d'un module spécifique unique )

5
mmuller

Si vous travaillez avec IntelliJ, ils ont une petite case à cocher magique: "Résoudre les artefacts de l'espace de travail" dans leur configuration d'exécution Maven. Donc pas besoin d'installer ni de construire à partir du parent.

4
Tomer

La réponse est juste que ce n'est pas la façon dont Maven fonctionne. L'idée derrière Maven est de donner au développeur un système simple et logique pour contrôler les dépendances. Obtenir les dépendances du référentiel est la clé de tout cela. Chaque exception affaiblit ce contrôle et cette simplicité. L'ajout de A en tant que dépendance dans le POM parent répond pleinement à votre scénario sans ajouter d'autres exceptions. L'utilisation de fichiers batch ou de scripts ant est une autre façon d'aborder votre scénario.

3
T Rob Darrough