Question

Mes collègues ont vanté les merveilles de Maven et de ses dépendances magiques, mais j’ai constaté qu’il échouait à ce que je considérerais comme une utilisation évidente.

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

Puis, en dessous de certains projets, appelez-les A et B

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

Maintenant, dans le dossier racine, dans un profil, je spécifie que je veux créer B.

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

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

Mais le problème de la gestion des dépendances n’est-il pas que Maven voit B, se rend dans le fichier POM B où il voit la dépendance sur A et doit donc se construire automatiquement A.

Était-ce utile?

La solution

La 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 projets A et B. Actuellement, A est en panne. Si la résolution de la dépendance se produisait comme vous le souhaiteriez, je ne pourrais jamais construire B tant que A n’aurait pas été corrigé. Je dois donc soit revenir sur mes modifications en A, soit me concentrer sur la correction de A en premier. De toute façon, peut-être pas ce sur quoi je veux me concentrer maintenant.

En général, B veut travailler avec le " last good " version de A plutôt que la dernière. Utiliser les dépendances du référentiel signifie qu’elles ont au moins bien été compilées (et, espérons-le, les tests unitaires ont également été exécutés).

Autres conseils

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 POM du module:

~/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 publier mvn package dans le répertoire racine après avoir effacé mon référentiel local et obtenir tous les modules construits. (Dans des fichiers JAR vides, mais construits.)

Maven semble rechercher des dépendances dans le référentiel ou dans la construction 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.)

Cela pourrait être dû au fait qu’une disposition de répertoires dans laquelle l’emplacement des modules serait prévisible n’est en aucun cas obligatoire. Il est même assez courant et acceptable que la présentation 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, la <modules> section du POM parent serait:

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

Notez qu'il n'y a rien qui indique quel ID d'artefact se trouve dans quel module. Cela sert simplement à dire à Maven que ce sont des emplacements de système de fichiers où rechercher d'autres artefacts liés à cette construction.

Consultez le plug-in du réacteur Maven , dans réacteur particulier: make, qui construit un module et tous les modules dont il dépend.

Rich a totalement raison. Ce que vous décrivez n'est généralement pas le comportement attendu. Comme indiqué par le déterbe, le réacteur Maven prend en charge les versions partielles si les modules sont connus du POM parent .

La construction avec mvn install -pl B -am devrait également créer (-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 )

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.

La réponse est simplement que ce n’est pas comme cela que 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 des dépendances à partir du référentiel est la clé pour 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'exceptions supplémentaires. L'utilisation de fichiers de commandes ou de scripts ant est un autre moyen de résoudre votre scénario.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top