Maven Multi-module dependency package not found
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>
Related videos on Youtube
Christiaan Janssen
Medior IT Consultant at Elision, Drummer and Producer of Bigwood Leonard, and Music Enthusiast.
Updated on September 26, 2022Comments
-
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 over 7 yearspackage be.bodyreset.rest.dto does not exist?? Why doesn't this exist??
-
Christiaan Janssen over 7 yearsThe 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 over 7 yearsThe 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 over 6 yearsWasted 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 about 5 yearsStill not working in my case ! First spring boot module's package is unable to find in 2nd module. How to fixed this now ?
-
Sml004 about 4 yearsNot success for me
-
Zon almost 3 years
exe
orexec
?