86

When running commands such as

mvn dependency:build-classpath

or

mvn exec:java

Maven is unable to resolve a dependency of one of my modules on another.

[ERROR] Failed to execute goal on project parser-app: Could not resolve dependencies for project project_group:A:jar:0.1-SNAPSHOT: Could not find artifact project_group:B:jar:0.1-SNAPSHOT

The project structure is as follows:

/pom.xml
/A/pom.xml
/B/pom.xml

The parent pom is as follows:

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>project_group</groupId>
  <artifactId>parent</artifactId>
  <packaging>pom</packaging>
  <version>0.1-SNAPSHOT</version>
  <name>parent</name>

  <modules>
    <module>A</module>
    <module>B</module>
  </modules>

The first child module (the one failing to resolve the dependency):

    <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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>parent_group</groupId>
    <artifactId>parent</artifactId>
    <version>0.1-SNAPSHOT</version>
  </parent>
  <artifactId>A</artifactId>
  <packaging>jar</packaging>
  <name>A</name>

  <dependencies>
    <dependency>
      <groupId>parent_group</groupId>
      <artifactId>B</artifactId>
      <version>0.1-SNAPSHOT</version>
    </dependency>

The second child module (the dependency):

  <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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>parent_group</groupId>
    <artifactId>parent</artifactId>
    <version>0.1-SNAPSHOT</version>
  </parent>
  <artifactId>B</artifactId>
  <packaging>jar</packaging>
  <name>B</name>
Beryllium
  • 12,808
  • 10
  • 56
  • 86
  • try interchanging the build structure, I mean rewrite your pom.xml to have B A. classes in module A needs classes from module B, then B has to be built first – Saurabh Jhunjhunwala Apr 18 '15 at 04:29
  • 1
    no change, as far as I knew the reactor should work out the order from the dependencies – Benjamin George Roberts Apr 18 '15 at 05:09
  • Correct the reactor should handle the order of building. No manuall handling needed nor should it be done. – khmarbaise Apr 18 '15 at 12:34
  • Possible duplicate of [Maven doesn't recognize sibling modules when running mvn dependency:tree](http://stackoverflow.com/questions/1677473/maven-doesnt-recognize-sibling-modules-when-running-mvn-dependencytree) – sschuberth May 05 '17 at 15:18

4 Answers4

106

Have you run mvn clean install at least once on the project to install the dependencies within your local repository?

Beryllium
  • 12,808
  • 10
  • 56
  • 86
Andrew McKee
  • 1,307
  • 1
  • 10
  • 9
  • 6
    That worked. This means I'd need to run install every time I update the dependant module right? I assumed there was a way for it to use most recently built copy (ie root/B/target/B-0.1-SNAPSHOT.jar) – Benjamin George Roberts Apr 19 '15 at 03:01
  • I think what you are looking for then is: http://stackoverflow.com/questions/4367665/java-maven-rebuild-dependency Most of the methods to do this are less well documented however as maven relies on the dependency model whereby your dependencies are installed within the local repository – Andrew McKee Apr 19 '15 at 10:03
  • 3
    I can mvn package and have the packages build against each other, however I assumed other actions (like generating the classpath or executing) would also use the most recently built packages, not whichever I installed to my local repository last. I'm guessing this might just be a compromise I have to live with? – Benjamin George Roberts Apr 19 '15 at 10:11
  • I found the parent project also need to install to local repo. – gfan Jun 02 '16 at 07:49
  • 51
    To me, it's ridiculous that maven would need to look in the local repository for submodules! Seriously? What a hack. – Chad Aug 31 '17 at 20:31
  • 4
    Sad to see if I have to install it to the local repo for **depedency:tree**! My module is still under development, installing them to local repo might cause some issue. – Albert Zhong Oct 13 '17 at 09:11
  • Run this command in Parent & in all child projects. It works for me. Thanks – Krishna Kumar Singh Jan 16 '20 at 07:20
  • for me this method works. The command `mvn clean install` must executed at least one time. After that everything works fine. – Ali Bigdeli Jan 07 '22 at 09:59
28

The Maven reactor is weird that way, it keeps modules around only for certain tasks. When running a build target that only does something for one subproject, then even if Maven builds dependencies first, it does not keep them around in the reactor (sometimes).

Installing to the local repository is a workaround, but it is horrible and should be avoided when possible, because you can easily end up with outdated build results.

A slightly less ugly workaround is to combine two build targets, where the second build target does something harmless, but triggers addition to reactor in all subprojects.

As an example you can combine the task you want with the 'compile' or 'package' tasks.

Also see highest voted answer at Maven doesn't recognize sibling modules when running mvn dependency:tree

tkruse
  • 10,222
  • 7
  • 53
  • 80
3

This error might also be caused by Maven being in offline mode.

Sometimes I seem to accidentally enable offline mode in IntelliJ IDEA. To disable it, toggle the Toggle Offline Mode toggle in the Maven Toolbar

enter image description here

or uncheck the Work Offline checkbox in the settings under Build, Execution, Deployment > Build Tools > Maven.

enter image description here

Marv
  • 3,517
  • 2
  • 22
  • 47
-2

Configuring test-jar in the jar plugin resolved the issue for me:

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.2.0</version>
        <executions>
          <execution>
            <goals>
              <goal>test-jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

Afterwards, running mvn clean install works.

simon04
  • 3,054
  • 29
  • 25