Missing artifact when creating a kids project with Maven 2

I have a parent project with 5 children who also have dependencies among themselves. I used both inheritance with the <parent> element in the child pom.xml, and aggregation with the <module> element in the parent.

My parent pom looks like this:

 <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>com.domain</groupId> <artifactId>Parent</artifactId> <packaging>pom</packaging> <version>RELEASE</version> <name>Parent</name> <modules> <module>../Child1</module> <module>../Child2</module> <module>../Child3</module> <module>../Child4</module> <module>../Child5</module> </modules> <dependencyManagement> <dependencies> <dependency> <groupId>com.domain</groupId> <artifactId>Child1</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>com.domain</groupId> <artifactId>Child2</artifactId> <version>RELEASE</version> </dependency> </dependencies> </dependencyManagement> </project> 

Child3 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>com.domain</groupId> <artifactId>Child3</artifactId> <name>Child3</name> <packaging>war</packaging> <parent> <artifactId>Parent</artifactId> <groupId>com.domain</groupId> <version>RELEASE</version> </parent> <dependencies> <dependency> <groupId>com.domain</groupId> <artifactId>Child1</artifactId> </dependency> <dependency> <groupId>com.domain</groupId> <artifactId>Child2</artifactId> </dependency> </dependencies> </project> 

Everything works fine when I run mvn install for parent or child1. But when I run it on Child3, I get the following errors:

 [INFO] Failed to resolve artifact. Missing: ---------- 1) com.domain:Child1:jar:RELEASE ... 2) com.domain:Child2:jar:RELEASE 

What happened to my setup?

+4
source share
1 answer

I will not try to solve the problem of your current approach, but rather consider what I consider the best in this case. Feel free to accept it or not :)

First of all, note that RELEASE (and LATEST ) is a special keyword (not sure if you know about it) and RELEASE somehow misused (parent with version, t20> doesn't really make sense). In any case, these special keywords were a bad idea and deprecated (I'm not sure if they are supported in Maven3) in order to create reproducibility, just don't use them.

So, use the SNAPSHOT version if the project is under active development, and do not change the parent element as follows:

 <project> <modelVersion>4.0.0</modelVersion> <groupId>com.domain</groupId> <artifactId>Parent</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>Parent</name> <modules> <module>../Child1</module> <module>../Child2</module> <module>../Child3</module> <module>../Child4</module> <module>../Child5</module> </modules> </project> 

Note that I removed the dependencyManagement element, I don’t think it provides a lot of added value for the internal dependencies of the assembly of several modules and recommends using ${project.groupId} and ${project.version} instead, declaring them:

 <project> <modelVersion>4.0.0</modelVersion> <parent> <artifactId>Parent</artifactId> <groupId>com.domain</groupId> <version>1.0-SNAPSHOT</version><!-- must hard code this --> </parent> <!--groupId>com.domain</groupId--><!-- you can skip this, you inherit it --> <artifactId>Child3</artifactId> <packaging>war</packaging> <name>Child3</name> <dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>Child1</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>Child2</artifactId> <version>${project.version}</version> </dependency> </dependencies> </project> 

As I already wrote, I don’t think that using dependencyManagement really useful for dependencies inside and how I set up my projects. But you can if you want. Just use properties to not repeat information.

+6
source

All Articles