Maven ne reconnaît pas les modules frères et soeurs lors de l'exécution dépendance mvn: arbre

StackOverflow https://stackoverflow.com/questions/1677473

Question

Je suis en train de mettre en place un projet Maven multi-modules, et les dépendances inter-modules ne sont apparemment pas configuré correctement.

Je:

<modules>
  <module>commons</module>
  <module>storage</module>
</modules>

dans le POM parent (qui a une pom-type de conditionnement) puis les sous-répertoires commons/ et storage/ qui définissent JAR poms avec le même nom.

Stockage dépend communes.

Dans le répertoire principal (maître), je lance mvn dependency:tree et voir:

[INFO] Building system
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
[INFO] domain:system:pom:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:3.8.1:test
[INFO] ------------------------------------------------------------------------
[INFO] Building commons
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
...correct tree...
[INFO] ------------------------------------------------------------------------
[INFO] Building storage
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
Downloading: http://my.repo/artifactory/repo/domain/commons/1.0-SNAPSHOT/commons-1.0-SNAPSHOT.jar
[INFO] Unable to find resource 'domain:commons:jar:1.0-SNAPSHOT' in repository my.repo (http://my.repo/artifactory/repo)
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.

Missing:
----------
1) domain:commons:jar:1.0-SNAPSHOT

Pourquoi la dépendance sur les « biens communs » échouent, même si le réacteur a évidemment vu parce qu'il traite avec succès son arbre de dépendance? Il devrait certainement pas aller au Net pour trouver comme il est là ...

Le pom pour le stockage:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <packaging>jar</packaging>
  <parent>
    <artifactId>system</artifactId>
    <groupId>domain</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <groupId>domain</groupId>
  <artifactId>storage</artifactId>
  <name>storage</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <!-- module dependencies -->
    <dependency>
      <groupId>domain</groupId>
      <artifactId>commons</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>

    <!-- other dependencies -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

Merci pour toutes suggestions!

(Edit)

Pour préciser, ce que je cherche ici est la suivante: je ne veux pas avoir à installer le module X pour construire le module Y qui dépend de X, étant donné que les deux sont des modules référencés de la même POM parent. Cela me semble logique intuitive que si j'ai deux choses dans le même arbre source, je ne devrais pas avoir à installer des produits intermédiaires pour continuer la construction. Espérons que ma façon de penser a un certain sens ici ...

Était-ce utile?

La solution

Je pense que le problème est que lorsque vous spécifiez une dépendance Maven attend à avoir comme pot (ou autre) emballé et disponible à partir d'au moins un repo local. Je suis sûr que si vous exécutez mvn install sur votre projet commun d'abord tout fonctionnera.

Autres conseils

Comme indiqué dans cette discussion la liste de diffusion de Maven , la dépendance: objectif de l'arbre lui-même va regarder les choses dans le dépôt plutôt que le réacteur. Vous pouvez contourner ce problème en installant mvn, comme suggéré précédemment, ou faire quelque chose de moins onéreuse qui invoque le réacteur, tel que

mvn compile dependency:tree

fonctionne pour moi.

La réalisation de ce fil est un plus, mais il semble que ce soit l'outil a évolué ou cela aurait pu manquer la première fois.

Il est possible d'effectuer une nouvelle génération qui rend les dépendances résolues sans installer en faisant une construction du réacteur.

Si vous démarrez votre construction dans le parent qui décrit la structure du module de votre projet, vos dépendances entre vos modules seront résolus lors de la construction elle-même à travers le réacteur Maven interne.

Bien sûr, ce n'est pas la solution parfaite, car elle ne résout pas la construction d'un seul module individuel au sein de la structure. Dans ce cas, Maven pas les dépendances dans son réacteur et l'abeille cherche à résoudre dans le référentiel. Donc, pour personne que vous avez construit encore installer d'abord les dépendances.

Voici quelques référence décrivant cette situation.

pour moi, ce qui m'a amené à ce fil était un problème similaire et la solution était d'assurer que toutes les dépendances du module pom a eu

 <packaging>pom</packaging>

parent avait

pom

mon dep modèle avait pom - donc il n'y avait pas de pot à trouver

.

La seule chose qui workd pour moi: le passage à Gradle: (

Je

Parent
  +---dep1
  +---war1 (using dep1)

et je peux juste cd WAR1 et utiliser mvn tomcat7: gestion guerre. Je dois toujours installer l'ensemble du projet avant, en dépit WAR1 fait référence à ses parents et les références des parents WAR1 et dep1 (sous forme de modules), de sorte que toutes les dépendances doivent être connues.

Je ne comprends pas quel est le problème.

Dans une structure de module Maven comme ceci:

- parent
  - child1
  - child2

Vous aurez dans le parent de pom ceci:

<modules>
  <module>child1</module>
  <module>child2</module>
</modules>

Si vous dépendez maintenant child1 dans child2 en mettant ce qui suit dans votre <dependencies> en child2:

<dependency>
  <groupId>example</groupId>
  <artifactId>child1</artifactId>
</dependency>

Vous recevrez une erreur qui ne peut pas être trouvé le JAR pour child1. Ceci peut être résolu en déclarant un bloc <dependencyManagement> dont child1 dans le pom pour parent:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>example</groupId>
      <artifactId>child1</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

child1 va maintenant être construit lorsque vous exécutez un compile ou un but package etc. sur parent et child2 trouverez les fichiers compilés de child1.

répondre Don Willis :

Si votre build crée test-pots pour partager le code de test parmi vos sous-modules de réacteur, vous devez utiliser:

mvn test-compile dependency:tree

qui permettra dependency:tree de courir jusqu'à la fin dans ce cas.

Assurez-vous que le module qui ne parvient pas se résoudre dans la pom, pointe vers le parent droit en incluant les configurations dans le fichier pom du module.

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