web-dev-qa-db-fra.com

Comment faire dépendre un module d'un autre artefact de module?

J'ai un projet multi-modules maven.

 A: parent.
    B: child1.
    C: child2.

B sera empaqueté pour obtenir le fichier jar, puis c utilisera ce fichier jar pour compiler le code.

En B, si je lance mvn package, cela créera b.jar (reste dans B/target/jars pas dedans B/target -à une autre fin).

En C, je dois utiliser ça b.jar pour compiler le code.

Maintenant, à partir de A, lorsque je lance: mvn package. Tout d'abord, j'ai réussi à créer b.jar fichier pour B.

Mais quand il s'agit de la phase de compilation de C, il semble que C ne reconnaît pas b.jar dans le chemin de classe (la compilation obtient des erreurs car le code de C ne peut pas importer le fichier de classe depuis B).

Ma question est: comment puis-je résoudre ce problème?

---------- Below sont les fichiers pom

A: pom.xml
  <groupId>AAA</groupId>
  <artifactId>A</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>

   <modules>
   <module>C</module>
   <module>B</module>
   </modules>

B: pom.xml
        <groupId>AAA</groupId>
 <artifactId>B</artifactId>
 <packaging>jar</packaging>
 <version>0.0.1-SNAPSHOT</version>
 <parent>
  <artifactId>A</artifactId>
  <groupId>AAA</groupId>
  <version>0.0.1-SNAPSHOT</version>
 </parent>

C: pom.xml
       <parent>
  <artifactId>A</artifactId>
  <groupId>AAA</groupId>
  <version>0.0.1-SNAPSHOT</version>
 </parent>

 <groupId>AAA</groupId>
 <artifactId>C</artifactId>
 <packaging>war</packaging>
 <version>0.0.1-SNAPSHOT</version>

 <dependencies>

  <dependency>
   <groupId>AAA</groupId>
   <artifactId>B</artifactId>
   <version>0.0.1-SNAPSHOT</version>
  </dependency>
....
39
David

On dirait que ça devrait marcher pour moi. Mais vous pourriez essayer mvn install au lieu de mvn package.

23
Matt McHenry

Essayez $ {project.version}

par exemple.

<dependency>
   <groupId>AAA</groupId>
   <artifactId>B</artifactId>
   <version>${project.version}</version>
  </dependency>
15
Justin Patel

Ma question est de savoir comment résoudre ce problème?

La résolution des dépendances se fait via le référentiel local, donc la manière canonique de "résoudre" le problème est d'exécuter install à partir de A afin que les modules soient installés dans le référentiel local.

Maintenant, concernant le commentaire suivant

Mais si je choisis l'installation, le fichier de guerre c sera également installé. Celui-là n'est pas accepté dans mon projet actuel ".

Bien sûr, je ne suis pas sur votre projet, je ne connais pas toutes les contraintes et les règles. Mais si vous décidez d'utiliser Maven, il s'agit d'une politique totalement ridicule (sérieusement, WTF?) Et l'utilisation d'une dépendance de portée system n'est certainement pas une bonne solution (plus de problèmes garantis plus tard). Si cette politique est réelle, mieux vaut ne pas utiliser Maven dans ce cas.

10
Pascal Thivent

j'ai une solution: utiliser la dépendance avec le système scope =

en C pom.xml

           <dependency>
            <groupId>AAA</groupId>
            <artifactId>B</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>system</scope>
            <systemPath>${basedir}\..\B\target\jars\b.jar</systemPath>
        </dependency>

et dans A pom.xml, placez le module B en haut comme ceci

<modules>
       <module>B</module>       
       <module>C</module>
 </modules>
2
David

L'installation de mvn place uniquement l'artefact dans le référentiel local .m2 de la machine sur laquelle vous exécutez la commande. Comment cela peut-il ne pas être acceptable? Je suis d'accord avec Pascal. Si vous construisez A, il ne devrait y avoir aucune raison pour que la guerre y soit placée.

D'un autre côté, si vous utilisez Maven 2.2.x, jetez un œil au plugin de réacteur maven ? Cela devrait aider le fou inacceptable ne peut pas installer C.war dans votre politique de référentiel .m2 local pour le projet en cours.

1
jgifford25