Maven Multi-module dependency package not found

18,511

Solution 1

I figured it out. The rest-client-microservice is a Spring Boot project and uses the following plugin:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

The jar is repackaged and all the packages and classes are put in the BOOT-INF folder. That's the reason why Maven is unable to find them. You can fix this by defining the plugin like this:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
            <configuration>
                <classifier>exec</classifier>
            </configuration>
        </execution>
    </executions>
</plugin>

With this configuration, the Spring Boot Maven Plugin will create 2 JARs: the main one will be the same as a usual Maven project, while the second one will have the classifier appended and be the executable JAR.

Solution 2

In the rest-client-microservice Spring Boot project add this configuration to the spring-boot-maven-plugin.

<configuration>
 <classifier>exe</classifier>
</configuration>

so it will look like that.

           <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exe</classifier>
                </configuration>
            </plugin>

Solution 3

I am using Spring Boot 2.2.7, for this version and later, removing the following from the parent pom.xml:

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>

solved the problem

Solution 4

Source: https://spring.io/guides/gs/multi-module/

To tell Maven to not build an executable jar for the Library project, you must remove the following block from the pom.xml created by the Spring Initializr:

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>
Share:
18,511

Related videos on Youtube

Christiaan Janssen
Author by

Christiaan Janssen

Medior IT Consultant at Elision, Drummer and Producer of Bigwood Leonard, and Music Enthusiast.

Updated on September 26, 2022

Comments

  • Christiaan Janssen
    Christiaan Janssen over 1 year

    I've got a multi module project: The parent POM.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <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/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.4.3.RELEASE</version>
        </parent>
    
        <groupId>be.bodyreset</groupId>
        <artifactId>bodyreset-parent</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <packaging>pom</packaging>
    
        <name>Bodyreset Parent</name>
        <description>Manages the common properties and dependencies for the child modules</description>
    
        <modules>
            <module>bodyreset-commons</module>
            <module>messaging-contract</module>
            <module>discovery-microservice</module>
            <module>api-gateway-microservice</module>
            <module>rest-client-microservice</module>
            <module>email-commons</module>
            <module>security-microservice</module>
            <module>user-microservice</module>
            <module>point-of-service-microservice</module>
        </modules>
    
        <properties>
            <docker.image.prefix>bodyreset</docker.image.prefix>
            <java.version>1.8</java.version>
            <powermock.version>1.6.6</powermock.version>
        </properties>
    
        <dependencyManagement>
            <dependencies>
                ...
            </dependencies>
        </dependencyManagement>
    
        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>com.spotify</groupId>
                        <artifactId>docker-maven-plugin</artifactId>
                        <version>0.4.11</version>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>3.6.0</version>
                        <configuration>
                            <source>${java.version}</source>
                            <target>${java.version}</target>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-jar-plugin</artifactId>
                        <version>3.0.2</version>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </project>
    

    The POM.xml of the rest-client-microservice looks like this:

    <?xml version="1.0" encoding="UTF-8"?>
    <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/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <parent>
            <groupId>be.bodyreset</groupId>
            <artifactId>bodyreset-parent</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </parent>
    
        <artifactId>rest-client-microservice</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>Rest Client Microservice</name>
        <description>Manages the REST clients to use for inter-service communication</description>
    
        <dependencies>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-hateoas</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-feign</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>build</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                        <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
                        <resources>
                            <resource>
                                <targetPath>/</targetPath>
                                <directory>${project.build.directory}</directory>
                                <include>${project.build.finalName}.jar</include>
                            </resource>
                        </resources>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>test-jar</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>
    

    The POM.xml of the email-commons module looks as follows:

    <?xml version="1.0" encoding="UTF-8"?>
    <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/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <parent>
            <groupId>be.bodyreset</groupId>
            <artifactId>bodyreset-parent</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </parent>
    
        <artifactId>email-commons</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>Email Commons</name>
        <description>Enables sending emails via SMPT</description>
    
        <dependencies>
            <dependency>
                <groupId>be.bodyreset</groupId>
                <artifactId>rest-client-microservice</artifactId>
                <version>1.0.0-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>be.bodyreset</groupId>
                <artifactId>rest-client-microservice</artifactId>
                <version>1.0.0-SNAPSHOT</version>
                <type>test-jar</type>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
            <dependency>
                <groupId>org.powermock</groupId>
                <artifactId>powermock-api-mockito</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.powermock</groupId>
                <artifactId>powermock-module-junit4</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-mail</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>test-jar</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>
    

    If I try to perform a maven clean install on the parent project, I get the following result:

    [INFO] ------------------------------------------------------------------------
    [INFO] Building Email Commons 1.0.0-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    [INFO] 
    [INFO] --- maven-clean-plugin:2.6.1:clean (default-clean) @ email-commons ---
    [INFO] Deleting /home/developer/ideaProjects/bodyreset/email-commons/target
    [INFO] 
    [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ email-commons ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 0 resource
    [INFO] Copying 2 resources
    [INFO] 
    [INFO] --- maven-compiler-plugin:3.6.0:compile (default-compile) @ email-commons ---
    [INFO] Changes detected - recompiling the module!
    [INFO] Compiling 17 source files to /home/developer/ideaProjects/bodyreset/email-commons/target/classes
    [INFO] -------------------------------------------------------------
    [ERROR] COMPILATION ERROR : 
    [INFO] -------------------------------------------------------------
    [ERROR] /home/developer/ideaProjects/bodyreset/email-commons/src/main/java/be/bodyreset/mail/converter/UserDTOToRecipientConverter.java:[4,29] package be.bodyreset.rest.dto does not exist
    [ERROR] /home/developer/ideaProjects/bodyreset/email-commons/src/main/java/be/bodyreset/mail/converter/UserDTOToRecipientConverter.java:[16,63] cannot find symbol
      symbol: class UserDTO
    [ERROR] /home/developer/ideaProjects/bodyreset/email-commons/src/main/java/be/bodyreset/mail/converter/UserDTOToRecipientConverter.java:[22,30] cannot find symbol
      symbol:   class UserDTO
      location: class be.bodyreset.mail.converter.UserDTOToRecipientConverter
    [ERROR] /home/developer/ideaProjects/bodyreset/email-commons/src/main/java/be/bodyreset/mail/converter/UserDTOToSenderConverter.java:[4,29] package be.bodyreset.rest.dto does not exist
    [ERROR] /home/developer/ideaProjects/bodyreset/email-commons/src/main/java/be/bodyreset/mail/converter/UserDTOToSenderConverter.java:[5,29] package be.bodyreset.rest.dto does not exist
    [ERROR] /home/developer/ideaProjects/bodyreset/email-commons/src/main/java/be/bodyreset/mail/converter/UserDTOToSenderConverter.java:[15,60] cannot find symbol
      symbol: class UserDTO
    [ERROR] /home/developer/ideaProjects/bodyreset/email-commons/src/main/java/be/bodyreset/mail/converter/UserDTOToSenderConverter.java:[21,27] cannot find symbol
      symbol:   class UserDTO
      location: class be.bodyreset.mail.converter.UserDTOToSenderConverter
    [ERROR] /home/developer/ideaProjects/bodyreset/email-commons/src/main/java/be/bodyreset/mail/service/impl/SenderServiceImpl.java:[7,32] package be.bodyreset.rest.client does not exist
    [ERROR] /home/developer/ideaProjects/bodyreset/email-commons/src/main/java/be/bodyreset/mail/service/impl/SenderServiceImpl.java:[8,32] package be.bodyreset.rest.client does not exist
    [ERROR] /home/developer/ideaProjects/bodyreset/email-commons/src/main/java/be/bodyreset/mail/service/impl/SenderServiceImpl.java:[9,29] package be.bodyreset.rest.dto does not exist
    [ERROR] /home/developer/ideaProjects/bodyreset/email-commons/src/main/java/be/bodyreset/mail/service/impl/SenderServiceImpl.java:[10,29] package be.bodyreset.rest.dto does not exist
    [ERROR] /home/developer/ideaProjects/bodyreset/email-commons/src/main/java/be/bodyreset/mail/service/impl/SenderServiceImpl.java:[34,13] cannot find symbol
      symbol:   class PointOfServiceClient
      location: class be.bodyreset.mail.service.impl.SenderServiceImpl
    [ERROR] /home/developer/ideaProjects/bodyreset/email-commons/src/main/java/be/bodyreset/mail/service/impl/SenderServiceImpl.java:[37,13] cannot find symbol
      symbol:   class UserClient
      location: class be.bodyreset.mail.service.impl.SenderServiceImpl
    [ERROR] /home/developer/ideaProjects/bodyreset/email-commons/src/main/java/be/bodyreset/mail/service/impl/SenderServiceImpl.java:[63,13] cannot find symbol
      symbol:   class PointOfServiceDTO
      location: class be.bodyreset.mail.service.impl.SenderServiceImpl
    [ERROR] /home/developer/ideaProjects/bodyreset/email-commons/src/main/java/be/bodyreset/mail/service/impl/RecipientServiceImpl.java:[7,32] package be.bodyreset.rest.client does not exist
    [ERROR] /home/developer/ideaProjects/bodyreset/email-commons/src/main/java/be/bodyreset/mail/service/impl/RecipientServiceImpl.java:[8,29] package be.bodyreset.rest.dto does not exist
    [ERROR] /home/developer/ideaProjects/bodyreset/email-commons/src/main/java/be/bodyreset/mail/service/impl/RecipientServiceImpl.java:[32,13] cannot find symbol
      symbol:   class UserClient
      location: class be.bodyreset.mail.service.impl.RecipientServiceImpl
    [INFO] 17 errors 
    [INFO] -------------------------------------------------------------
    [INFO] ------------------------------------------------------------------------
    [INFO] Reactor Summary:
    [INFO] 
    [INFO] Bodyreset Parent .................................. SUCCESS [0.690s]
    [INFO] Bodyreset Commons ................................. SUCCESS [7.444s]
    [INFO] Messaging Contract ................................ SUCCESS [1.751s]
    [INFO] Discovery Microservice ............................ SUCCESS [19.925s]
    [INFO] API Gateway Microservice .......................... SUCCESS [17.272s]
    [INFO] Rest Client Microservice .......................... SUCCESS [15.271s]
    [INFO] Email Commons ..................................... FAILURE [1.026s]
    [INFO] Security Microservice ............................. SKIPPED
    [INFO] User Microservice ................................. SKIPPED
    [INFO] Point Of Service Microservice ..................... SKIPPED
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD FAILURE
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 1:04.292s
    [INFO] Finished at: Thu Jan 19 11:53:25 CET 2017
    [INFO] Final Memory: 63M/656M
    [INFO] ------------------------------------------------------------------------
    

    I've been breaking my head on this issue for several days now, but I don't have a clue why this isn't working.

    • Niku Hysa
      Niku Hysa over 7 years
      package be.bodyreset.rest.dto does not exist?? Why doesn't this exist??
    • Christiaan Janssen
      Christiaan Janssen over 7 years
      The package exists. I can find the class files in the .jar file that's generated. IntelliJ does not complain and recognizes the packages and classes of the rest-client-microservice dependency.
    • Niku Hysa
      Niku Hysa over 7 years
      The system is saying that the error is there, so i would suggest taking a closer look at it and figure out if there are any problems with it. Just by looking at the output you have provided we can't find what the problem is!
  • sunny_dev
    sunny_dev over 6 years
    Wasted 2 hours trying to figure this out. I was wondering something is wrong with my Maven, however turns out that Spring boot Build plugin by default puts all class files in BOOT-INF folder which was causing the compiler error. Ended up using the plain vanilla "maven-compiler-plugin" which is when I came across your better solution. Thanks
  • PAA
    PAA about 5 years
    Still not working in my case ! First spring boot module's package is unable to find in 2nd module. How to fixed this now ?
  • Sml004
    Sml004 about 4 years
    Not success for me
  • Zon
    Zon almost 3 years
    exe or exec?