Je suis actuellement en train d'essayer de structurer mon application Spring Boot Maven avec plusieurs fichiers pom. J'ai deux applications qui ont besoin de partager beaucoup de classes. J'ai la structure suivante :
.
application1
| | src
pom.xml
| application2
| | src
pom.xml
| shared
| src
| pom.xml
|
pom.xml
Le pom dans le répertoire Root ressemble à ceci :
<?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>2.1.3.RELEASE</version>
<relativePath/>
</parent>
<groupId>nl.example.parent</groupId>
<artifactId>example-parent</artifactId>
<packaging>pom</packaging>
<version>1.0.0-SNAPSHOT</version>
<!-- sub modules -->
<modules>
<module>application1</module>
<module>application2</module>
<module>shared</module>
</modules>
<properties>
<java.version>1.8</java.version>
<maven.plugins.version>2.22.1</maven.plugins.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</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-security</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<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>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${maven.plugins.version}</version>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven.plugins.version}</version>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>application1</id>
<modules>
<module>shared</module>
<module>application1</module>
</modules>
</profile>
<profile>
<id>application2</id>
<modules>
<module>shared</module>
<module>application2</module>
</modules>
</profile>
</profiles>
</project>
Le pom dans les répertoires application1 et application2 ressemble à ceci :
<?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>nl.example.parent</groupId>
<artifactId>example-parent</artifactId>
<version>1.0</version>
</parent>
<groupId>nl.example.application1</groupId>
<artifactId>example-child</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<dependencies>
<!-- Is this the right way to import the shared module into application1 or application2? -->
<dependency>
<groupId>nl.example.shared</groupId>
<artifactId>example-shared</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
Ensuite, j'ai un module partagé dont la plupart des classes seront partagées entre l'application1 et l'application2. Le pom du répertoire partagé ressemble à ceci :
<?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>nl.example.parent</groupId>
<artifactId>example-parent</artifactId>
<version>1.0</version>
</parent>
<groupId>nl.example.shared</groupId>
<artifactId>example-shared</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<dependencies>
<!-- Shared dependencies here -->
</dependencies>
</project>
Cependant, lorsque j'essaie de construire le profil spécifique pour l'une des deux applications, je reçois des erreurs pour chaque importation que j'essaie de faire à partir du module partagé. Il est évident que je fais quelque chose de mal, mais je n'arrive pas à comprendre pourquoi les classes du dossier partagé ne sont pas accessibles lorsqu'elles sont appelées depuis l'application 1. J'ai inclus le module partagé comme dépendance dans l'application1 et l'application2.