web-dev-qa-db-fra.com

Paquet de dépendances multi-modules Maven introuvable

J'ai un projet multi-module: Le POM.xml parent:

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

Le fichier POM.xml du reste du client microservice se présente comme suit:

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

Le fichier POM.xml du module email-commons se présente comme suit:

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

Si j'essaie d'exécuter un maven clean install sur le projet parent, j'obtiens le résultat suivant:

[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] ------------------------------------------------------------------------

Cela fait plusieurs jours que je me casse la tête à ce sujet, mais je ne comprends pas pourquoi cela ne fonctionne pas.

9
Christiaan Janssen

Je l'ai compris. Rest-client-microservice est un projet Spring Boot et utilise le plugin suivant:

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

Le fichier jar est reconditionné et tous les packages et les classes sont placés dans le dossier BOOT-INF. C'est la raison pour laquelle Maven est incapable de les trouver. Vous pouvez résoudre ce problème en définissant le plugin comme ceci:

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

Avec cette configuration, le plug-in Spring Boot Maven créera 2 JAR: le principal sera identique à un projet Maven habituel, tandis que le second aura le classificateur ajouté et sera le JAR exécutable.

31
Christiaan Janssen

Pour Spring Boot 2, bootRepackage n'existe plus en tant que tâche. Il est remplacé par la tâche bootJar. Pour construire deux pots en utilisant Gradle, j'ai ajouté ceci à mon module de base:

jar {
    enabled = true
}
0
Mike Melusky