70

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>
....
Lii
  • 11,553
  • 8
  • 64
  • 88
David
  • 3,538
  • 9
  • 39
  • 50
  • 13
    Just as a best practice (unrelated to this question), modules B and C should not declare their own groupId and version; they should inherit these from the parent (module A) POM. They still need to declare their own packaging and artifactId though. – Andrew Swan Dec 08 '10 at 00:17

7 Answers7

46

Try ${project.version}

e.g.

<dependency>
   <groupId>AAA</groupId>
   <artifactId>B</artifactId>
   <version>${project.version}</version>
</dependency>
Peter Csala
  • 17,736
  • 16
  • 35
  • 75
Justin Patel
  • 1,323
  • 10
  • 5
31

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

Matt McHenry
  • 20,009
  • 8
  • 65
  • 64
  • 1
    Thanks. It is a good idea. But if I go with install then c war file will also be installed. That one is not accepted in my current project. Only jar file is allowed to install – David Nov 11 '10 at 04:46
13

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.

Pascal Thivent
  • 562,542
  • 136
  • 1,062
  • 1,124
  • 1
    Oh, you are right. If install only copy the artifact to local repository, that is okay to me. I though install will copy the artifact to remote repository (i confused between install and deploy). Thanks. – David Nov 14 '10 at 22:11
4

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>
David
  • 3,538
  • 9
  • 39
  • 50
  • 12
    David, I have no idea of what you're doing and why "war is not accepted in your current project" but, not offense, this is definitely not the right way. – Pascal Thivent Nov 12 '10 at 07:06
1

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.

jgifford25
  • 2,164
  • 1
  • 14
  • 17
  • Oh, you are right. If install only copy the artifact to local repository, that is okay to me. I though install will copy the artifact to remote repository (i confused between install and deploy). Thanks. – David Nov 14 '10 at 22:09
0

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
Gilbert
  • 2,699
  • 28
  • 29
-1

Here are what I did to solve it:

  1. From intelij , create new module from existing source.
  2. Change the version of dependency B in A.pom same as version of B in B.pom
huuthang
  • 454
  • 1
  • 4
  • 11