How to make one module depend on another module artifact?

ModuleDependenciesMaven

Module Problem Overview


I have maven multiple-module project.

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

B will be packaged to get jar file and then c will use this jar file to compile the code.

In B, if I run mvn package, it will create b.jar (stays in B/target/jars not in B/target -for another purpose).

In C, I need to use that b.jar to compile the code.

Now, from A, when I run: mvn package. First, I am successful to create b.jar file for B.

But when it come to C's compilation phase, it looks like C doesn't recognize b.jar in the classpath (the compilation gets errors because C's code can not import the class file from B).

My question is: How can I solve this problem?

---------- Below are the pom files

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>
....

Module Solutions


Solution 1 - Module

Try ${project.version}

e.g.

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

Solution 2 - Module

Looks like it should work to me. But you might try mvn install instead of mvn package.

Solution 3 - Module

> My question is how I can solve this problem?

Dependency resolution is done through the local repository so the canonical way to "solve" the problem is to run install from A so that modules will get installed in the local repository.

Now, regarding the following comment

> But if I go with install then c war file will also be installed. That one is not accepted in my current project".

Sure, I'm not on your project, I don't know all constraints and rules. But if you decide to use Maven, this is a totally ridiculous policy (seriously, WTF?) and using a system scoped dependency is certainly not a good solution (more troubles later guaranteed). If this policy is real, better not use Maven in that case.

Solution 4 - Module

i have a solution: using the dependency with the scope=system

in 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>

and in A pom.xml, put module B on the top like this

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

Solution 5 - Module

Doing mvn install only places the artifact into the local .m2 repository of the machine you're running the command on. How can that not be acceptable? I agree with Pascal. If you building A, there should be no reason that a the war is placed there.

On the other hand, if you're using Maven 2.2.x, take a look at the maven reactor plugin? This should help the crazy unacceptable cannot install C.war into your local .m2 repository policy for the current project.

Solution 6 - Module

If you have moduleA on your machine say at D:\moduleA and inside moduleA you have created another module say moduleB at D:\moduleA\moduleB , for you to use moduleB inside moduleA you create a dependency in the pom.xml file of moduleA like so:

<project xmlns="http://maven.apache.org/POM/4.0.0" ...>
    ...
    <groupId>net.passioncloud</groupId>
    <artifactId>moduleA</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>net.passioncloud</groupId>
            <artifactId>moduleB</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
     <dependencies>
     ...

To compile the project so you can use it, from the module folder (moduleB) do:

.\mvnw clean install

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDavidView Question on Stackoverflow
Solution 1 - ModuleJustin PatelView Answer on Stackoverflow
Solution 2 - ModuleMatt McHenryView Answer on Stackoverflow
Solution 3 - ModulePascal ThiventView Answer on Stackoverflow
Solution 4 - ModuleDavidView Answer on Stackoverflow
Solution 5 - Modulejgifford25View Answer on Stackoverflow
Solution 6 - ModuleGilbertView Answer on Stackoverflow