2

I set up a sample project to understand the clean plugin in maven as to how it cleans a child project when the mvn clean:clean is run from the parent project location. Somehow, I see that maven deletes target of parent project but not of child project. This confuses me.

Here is my project structure :

enter image description here

Now the java code is minimal in the project - just a hello world project. I will just show the POM files.

POM for parent project :

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

  <groupId>com.practice</groupId>
  <artifactId>learning-maven</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>


  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

POM for child project :

<?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>com.practice</groupId>
        <artifactId>learning-maven</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>child-module1</artifactId>
    <version>1.0-SNAPSHOT</version>

</project>

I am only focussing on the clean plugin and not on anything else. The POM are hence minimal. My question is what is wrong with child pom that maven not cleaning it's target folder ?

I show the <build> tag in effective pom of child project too :

 <plugins>
      <plugin>
        <artifactId>maven-clean-plugin</artifactId>
        <version>2.5</version>
        <executions>
          <execution>
            <id>default-clean</id>
            <phase>clean</phase>
            <goals>
              <goal>clean</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.6</version>
        <executions>
          <execution>
            <id>default-testResources</id>
            <phase>process-test-resources</phase>
            <goals>
              <goal>testResources</goal>
            </goals>
          </execution>
          <execution>
            <id>default-resources</id>
            <phase>process-resources</phase>
            <goals>
              <goal>resources</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <executions>
          <execution>
            <id>default-jar</id>
            <phase>package</phase>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <executions>
          <execution>
            <id>default-compile</id>
            <phase>compile</phase>
            <goals>
              <goal>compile</goal>
            </goals>
            <configuration>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
          </execution>
          <execution>
            <id>default-testCompile</id>
            <phase>test-compile</phase>
            <goals>
              <goal>testCompile</goal>
            </goals>
            <configuration>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
          </execution>
        </executions>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.4</version>
        <executions>
          <execution>
            <id>default-test</id>
            <phase>test</phase>
            <goals>
              <goal>test</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-install-plugin</artifactId>
        <version>2.4</version>
        <executions>
          <execution>
            <id>default-install</id>
            <phase>install</phase>
            <goals>
              <goal>install</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>2.7</version>
        <executions>
          <execution>
            <id>default-deploy</id>
            <phase>deploy</phase>
            <goals>
              <goal>deploy</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-site-plugin</artifactId>
        <version>3.3</version>
        <executions>
          <execution>
            <id>default-site</id>
            <phase>site</phase>
            <goals>
              <goal>site</goal>
            </goals>
            <configuration>
              <outputDirectory>/Users/myUserName/learning-maven/child-module1/target/site</outputDirectory>
              <reportPlugins>
                <reportPlugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-project-info-reports-plugin</artifactId>
                </reportPlugin>
              </reportPlugins>
            </configuration>
          </execution>
          <execution>
            <id>default-deploy</id>
            <phase>site-deploy</phase>
            <goals>
              <goal>deploy</goal>
            </goals>
            <configuration>
              <outputDirectory>/Users/myUserName/learning-maven/child-module1/target/site</outputDirectory>
              <reportPlugins>
                <reportPlugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-project-info-reports-plugin</artifactId>
                </reportPlugin>
              </reportPlugins>
            </configuration>
          </execution>
        </executions>
        <configuration>
          <outputDirectory>/Users/myUserName/learning-maven/child-module1/target/site</outputDirectory>
          <reportPlugins>
            <reportPlugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-project-info-reports-plugin</artifactId>
            </reportPlugin>
          </reportPlugins>
        </configuration>
      </plugin>
    </plugins>
  </build>
Number945
  • 4,631
  • 8
  • 45
  • 83

2 Answers2

2

You have to indicate in the parent POM the child modules, i.e :

<modules>
    <module>../child-module1</module>
</modules>
Arnaud
  • 17,229
  • 3
  • 31
  • 44
  • We define `` in aggregation (sub module) and not when we need to define a child module. However , aggregation and inheritance can both co exist. [Here](https://www.oodlestechnologies.com/blogs/Project-Inheritance-and-Aggregation-in-POM) for more info. – Number945 May 03 '19 at 13:01
  • 1
    Without module entries in the parent pom, the parent does not "know" about any child "modules", so a `clean` cannot alter target directories in the children. – J Fabian Meier May 03 '19 at 13:43
  • @JFMeier , Yes this works after it. But is not it a bug/inefficiency in clean plugin as it is forcing us to have a aggregation relationship ? This way I also forced to declare packaging of parent project as `pom` ? – Number945 May 03 '19 at 13:54
  • First of all, parent POMs should always have packaging `pom`. Secondly, an operation on a parent POM project should _not_ automatically apply to child projects because parent POMs are not only used in multi-module builds but also as company parent POMs. In a multi-module context, though, it is usually advisable to use the parent POM also as aggregator. – J Fabian Meier May 03 '19 at 13:58
  • @JFMeier , I think parent pom can even have jar packaging but aggregator pom should always have `pom` packaging. – Number945 May 03 '19 at 14:02
  • It may be technically possible to have a different packaging for a parent POM, but I would advise strongly against it. Note that Maven allows you to do a lot of things, but many approaches are not "Maven-like". Those approaches often cause trouble in the future. One example: We constructed a plugin that produced two jars out of one POM (without multi-module). It does what it should, but caused a lot of trouble in the long run (IDEs, refactoring, other maven plugins...). – J Fabian Meier May 03 '19 at 14:07
1

As Arnaud said, you need to put in you pom parent the child modules. You don't need paths, just the artifactId

<modules>
    <module>child-module1</module>
</modules> 
David B.
  • 11
  • 2