You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@maven.apache.org by Andres Almiray <aa...@gmail.com> on 2020/10/15 10:25:20 UTC

Merged configuration between parent & child?

Hello everyone,

I wonder if it's possible to define a plugin's configuration on both parent
& child in such a way that the resulting configuration is merged, first
the  parent's then the child's. My use case is defining a set of annotation
processors in the maven-compiler-plugin at the parent, also adding another
set in the child's maven-compiler-plugin.

The following example is NOT explicitly related to Lombok nor AutoValue,
they are used just as reference. Suggestions to skip Lombok and/or
AutoValue are not needed, thanks.

Given a parent pom such as

<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.acme</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.0</version>
    <packaging>pom</packaging>

    <properties>
        <auto-value.version>1.7.4</auto-value.version>
        <lombok.version>1.18.14</lombok.version>
    </properties>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-compiler-plugin</artifactId>
                  <version>3.8.1</version>
                  <configuration>
                      <annotationProcessorPaths>
                          <path>
                              <groupId>org.projectlombok</groupId>
                              <artifactId>lombok</artifactId>
                              <version>1.18.14</version>
                          </path>
                      </annotationProcessorPaths>
                  </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

And a child pom as

<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.acme</groupId>
        <artifactId>parent</artifactId>
        <version>0.0.0</version>
    </parent>

    <artifactId>child</artifactId>

    <build>
        <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.8.1</version>
              <inherited>true</inherited>
              <configuration>
                  <annotationProcessorPaths>
                      <path>
                          <groupId>com.google.auto.value</groupId>
                          <artifactId>auto-value</artifactId>
                          <version>${auto-value.version}</version>
                      </path>
                  </annotationProcessorPaths>
              </configuration>
            </plugin>
        </plugins>
    </build>
</project>

The desired result when evaluating the child's pom is to have both Lombok
and AutoValue (in that order) in the compiler's configuration. As it
currently stands with Maven 3.6.3 only the child configuration is
available, as shown by running `mvn help:effective-pom`

      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <executions>
          <execution>
            <id>default-compile</id>
            <phase>compile</phase>
            <goals>
              <goal>compile</goal>
            </goals>
            <configuration>
              <annotationProcessorPaths>
                <path>
                  <groupId>com.google.auto.value</groupId>
                  <artifactId>auto-value</artifactId>
                  <version>1.7.4</version>
                </path>
              </annotationProcessorPaths>
            </configuration>
          </execution>
          <execution>
            <id>default-testCompile</id>
            <phase>test-compile</phase>
            <goals>
              <goal>testCompile</goal>
            </goals>
            <configuration>
              <annotationProcessorPaths>
                <path>
                  <groupId>com.google.auto.value</groupId>
                  <artifactId>auto-value</artifactId>
                  <version>1.7.4</version>
                </path>
              </annotationProcessorPaths>
            </configuration>
          </execution>
        </executions>
        <inherited>true</inherited>
        <configuration>
          <annotationProcessorPaths>
            <path>
              <groupId>com.google.auto.value</groupId>
              <artifactId>auto-value</artifactId>
              <version>1.7.4</version>
            </path>
          </annotationProcessorPaths>
        </configuration>
      </plugin>

Cheers,
Andres

Re: Merged configuration between parent & child?

Posted by Jörg Schaible <jo...@gmx.de>.
If you put your configuration additionally into a profile in the parent, that is
activated e.g. on the existence of the file "profiles/lombok". Then you can
simply create that in those child projects individually that use the
processor. Personally I share typically the profile's name with the one of the
file in the profiles directory...

On Thursday, 15. October 2020, 13:24:41 CEST Andres Almiray wrote:
> Thank you Anders, the `combine.children="append"` attribute applied to the
> child's <annotationProcessor> element does the trick.
>
> Wonderful!
>
> On Thu, Oct 15, 2020 at 12:54 PM Anders Hammar <an...@hammar.net> wrote:
> > Maybe this blog post helps:
> >
> > https://blog.sonatype.com/2011/01/maven-how-to-merging-plugin-configuratio
> > n-in-complex-projects/
> >
> > /Anders
> >
> > On Thu, Oct 15, 2020 at 12:25 PM Andres Almiray <aa...@gmail.com>
> >
> > wrote:
> > > Hello everyone,
> > >
> > > I wonder if it's possible to define a plugin's configuration on both
> >
> > parent
> >
> > > & child in such a way that the resulting configuration is merged, first
> > > the  parent's then the child's. My use case is defining a set of
> >
> > annotation
> >
> > > processors in the maven-compiler-plugin at the parent, also adding
> >
> > another
> >
> > > set in the child's maven-compiler-plugin.
> > >
> > > The following example is NOT explicitly related to Lombok nor AutoValue,
> > > they are used just as reference. Suggestions to skip Lombok and/or
> > > AutoValue are not needed, thanks.
> > >
> > > Given a parent pom such as
> > >
> > > <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.acme</groupId>
> > >     <artifactId>parent</artifactId>
> > >     <version>0.0.0</version>
> > >     <packaging>pom</packaging>
> > >
> > >     <properties>
> > >
> > >         <auto-value.version>1.7.4</auto-value.version>
> > >         <lombok.version>1.18.14</lombok.version>
> > >
> > >     </properties>
> > >
> > >     <build>
> > >
> > >         <pluginManagement>
> > >
> > >             <plugins>
> > >
> > >                 <plugin>
> > >
> > >                   <groupId>org.apache.maven.plugins</groupId>
> > >                   <artifactId>maven-compiler-plugin</artifactId>
> > >                   <version>3.8.1</version>
> > >                   <configuration>
> > >
> > >                       <annotationProcessorPaths>
> > >
> > >                           <path>
> > >
> > >                               <groupId>org.projectlombok</groupId>
> > >                               <artifactId>lombok</artifactId>
> > >                               <version>1.18.14</version>
> > >
> > >                           </path>
> > >
> > >                       </annotationProcessorPaths>
> > >
> > >                   </configuration>
> > >
> > >                 </plugin>
> > >
> > >             </plugins>
> > >
> > >         </pluginManagement>
> > >
> > >     </build>
> > >
> > > </project>
> > >
> > > And a child pom as
> > >
> > > <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.acme</groupId>
> > >         <artifactId>parent</artifactId>
> > >         <version>0.0.0</version>
> > >
> > >     </parent>
> > >
> > >     <artifactId>child</artifactId>
> > >
> > >     <build>
> > >
> > >         <plugins>
> > >
> > >             <plugin>
> > >
> > >               <groupId>org.apache.maven.plugins</groupId>
> > >               <artifactId>maven-compiler-plugin</artifactId>
> > >               <version>3.8.1</version>
> > >               <inherited>true</inherited>
> > >               <configuration>
> > >
> > >                   <annotationProcessorPaths>
> > >
> > >                       <path>
> > >
> > >                           <groupId>com.google.auto.value</groupId>
> > >                           <artifactId>auto-value</artifactId>
> > >                           <version>${auto-value.version}</version>
> > >
> > >                       </path>
> > >
> > >                   </annotationProcessorPaths>
> > >
> > >               </configuration>
> > >
> > >             </plugin>
> > >
> > >         </plugins>
> > >
> > >     </build>
> > >
> > > </project>
> > >
> > > The desired result when evaluating the child's pom is to have both
> > > Lombok
> > > and AutoValue (in that order) in the compiler's configuration. As it
> > > currently stands with Maven 3.6.3 only the child configuration is
> > > available, as shown by running `mvn help:effective-pom`
> > >
> > >       <plugin>
> > >
> > >         <artifactId>maven-compiler-plugin</artifactId>
> > >         <version>3.8.1</version>
> > >         <executions>
> > >
> > >           <execution>
> > >
> > >             <id>default-compile</id>
> > >             <phase>compile</phase>
> > >             <goals>
> > >
> > >               <goal>compile</goal>
> > >
> > >             </goals>
> > >             <configuration>
> > >
> > >               <annotationProcessorPaths>
> > >
> > >                 <path>
> > >
> > >                   <groupId>com.google.auto.value</groupId>
> > >                   <artifactId>auto-value</artifactId>
> > >                   <version>1.7.4</version>
> > >
> > >                 </path>
> > >
> > >               </annotationProcessorPaths>
> > >
> > >             </configuration>
> > >
> > >           </execution>
> > >           <execution>
> > >
> > >             <id>default-testCompile</id>
> > >             <phase>test-compile</phase>
> > >             <goals>
> > >
> > >               <goal>testCompile</goal>
> > >
> > >             </goals>
> > >             <configuration>
> > >
> > >               <annotationProcessorPaths>
> > >
> > >                 <path>
> > >
> > >                   <groupId>com.google.auto.value</groupId>
> > >                   <artifactId>auto-value</artifactId>
> > >                   <version>1.7.4</version>
> > >
> > >                 </path>
> > >
> > >               </annotationProcessorPaths>
> > >
> > >             </configuration>
> > >
> > >           </execution>
> > >
> > >         </executions>
> > >         <inherited>true</inherited>
> > >         <configuration>
> > >
> > >           <annotationProcessorPaths>
> > >
> > >             <path>
> > >
> > >               <groupId>com.google.auto.value</groupId>
> > >               <artifactId>auto-value</artifactId>
> > >               <version>1.7.4</version>
> > >
> > >             </path>
> > >
> > >           </annotationProcessorPaths>
> > >
> > >         </configuration>
> > >
> > >       </plugin>
> > >
> > > Cheers,
> > > Andres





---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org


Re: Merged configuration between parent & child?

Posted by Andres Almiray <aa...@gmail.com>.
Thank you Anders, the `combine.children="append"` attribute applied to the
child's <annotationProcessor> element does the trick.

Wonderful!

On Thu, Oct 15, 2020 at 12:54 PM Anders Hammar <an...@hammar.net> wrote:

> Maybe this blog post helps:
>
> https://blog.sonatype.com/2011/01/maven-how-to-merging-plugin-configuration-in-complex-projects/
>
> /Anders
>
> On Thu, Oct 15, 2020 at 12:25 PM Andres Almiray <aa...@gmail.com>
> wrote:
>
> > Hello everyone,
> >
> > I wonder if it's possible to define a plugin's configuration on both
> parent
> > & child in such a way that the resulting configuration is merged, first
> > the  parent's then the child's. My use case is defining a set of
> annotation
> > processors in the maven-compiler-plugin at the parent, also adding
> another
> > set in the child's maven-compiler-plugin.
> >
> > The following example is NOT explicitly related to Lombok nor AutoValue,
> > they are used just as reference. Suggestions to skip Lombok and/or
> > AutoValue are not needed, thanks.
> >
> > Given a parent pom such as
> >
> > <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.acme</groupId>
> >     <artifactId>parent</artifactId>
> >     <version>0.0.0</version>
> >     <packaging>pom</packaging>
> >
> >     <properties>
> >         <auto-value.version>1.7.4</auto-value.version>
> >         <lombok.version>1.18.14</lombok.version>
> >     </properties>
> >
> >     <build>
> >         <pluginManagement>
> >             <plugins>
> >                 <plugin>
> >                   <groupId>org.apache.maven.plugins</groupId>
> >                   <artifactId>maven-compiler-plugin</artifactId>
> >                   <version>3.8.1</version>
> >                   <configuration>
> >                       <annotationProcessorPaths>
> >                           <path>
> >                               <groupId>org.projectlombok</groupId>
> >                               <artifactId>lombok</artifactId>
> >                               <version>1.18.14</version>
> >                           </path>
> >                       </annotationProcessorPaths>
> >                   </configuration>
> >                 </plugin>
> >             </plugins>
> >         </pluginManagement>
> >     </build>
> > </project>
> >
> > And a child pom as
> >
> > <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.acme</groupId>
> >         <artifactId>parent</artifactId>
> >         <version>0.0.0</version>
> >     </parent>
> >
> >     <artifactId>child</artifactId>
> >
> >     <build>
> >         <plugins>
> >             <plugin>
> >               <groupId>org.apache.maven.plugins</groupId>
> >               <artifactId>maven-compiler-plugin</artifactId>
> >               <version>3.8.1</version>
> >               <inherited>true</inherited>
> >               <configuration>
> >                   <annotationProcessorPaths>
> >                       <path>
> >                           <groupId>com.google.auto.value</groupId>
> >                           <artifactId>auto-value</artifactId>
> >                           <version>${auto-value.version}</version>
> >                       </path>
> >                   </annotationProcessorPaths>
> >               </configuration>
> >             </plugin>
> >         </plugins>
> >     </build>
> > </project>
> >
> > The desired result when evaluating the child's pom is to have both Lombok
> > and AutoValue (in that order) in the compiler's configuration. As it
> > currently stands with Maven 3.6.3 only the child configuration is
> > available, as shown by running `mvn help:effective-pom`
> >
> >       <plugin>
> >         <artifactId>maven-compiler-plugin</artifactId>
> >         <version>3.8.1</version>
> >         <executions>
> >           <execution>
> >             <id>default-compile</id>
> >             <phase>compile</phase>
> >             <goals>
> >               <goal>compile</goal>
> >             </goals>
> >             <configuration>
> >               <annotationProcessorPaths>
> >                 <path>
> >                   <groupId>com.google.auto.value</groupId>
> >                   <artifactId>auto-value</artifactId>
> >                   <version>1.7.4</version>
> >                 </path>
> >               </annotationProcessorPaths>
> >             </configuration>
> >           </execution>
> >           <execution>
> >             <id>default-testCompile</id>
> >             <phase>test-compile</phase>
> >             <goals>
> >               <goal>testCompile</goal>
> >             </goals>
> >             <configuration>
> >               <annotationProcessorPaths>
> >                 <path>
> >                   <groupId>com.google.auto.value</groupId>
> >                   <artifactId>auto-value</artifactId>
> >                   <version>1.7.4</version>
> >                 </path>
> >               </annotationProcessorPaths>
> >             </configuration>
> >           </execution>
> >         </executions>
> >         <inherited>true</inherited>
> >         <configuration>
> >           <annotationProcessorPaths>
> >             <path>
> >               <groupId>com.google.auto.value</groupId>
> >               <artifactId>auto-value</artifactId>
> >               <version>1.7.4</version>
> >             </path>
> >           </annotationProcessorPaths>
> >         </configuration>
> >       </plugin>
> >
> > Cheers,
> > Andres
> >
>

Re: Merged configuration between parent & child?

Posted by Anders Hammar <an...@hammar.net>.
Maybe this blog post helps:
https://blog.sonatype.com/2011/01/maven-how-to-merging-plugin-configuration-in-complex-projects/

/Anders

On Thu, Oct 15, 2020 at 12:25 PM Andres Almiray <aa...@gmail.com> wrote:

> Hello everyone,
>
> I wonder if it's possible to define a plugin's configuration on both parent
> & child in such a way that the resulting configuration is merged, first
> the  parent's then the child's. My use case is defining a set of annotation
> processors in the maven-compiler-plugin at the parent, also adding another
> set in the child's maven-compiler-plugin.
>
> The following example is NOT explicitly related to Lombok nor AutoValue,
> they are used just as reference. Suggestions to skip Lombok and/or
> AutoValue are not needed, thanks.
>
> Given a parent pom such as
>
> <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.acme</groupId>
>     <artifactId>parent</artifactId>
>     <version>0.0.0</version>
>     <packaging>pom</packaging>
>
>     <properties>
>         <auto-value.version>1.7.4</auto-value.version>
>         <lombok.version>1.18.14</lombok.version>
>     </properties>
>
>     <build>
>         <pluginManagement>
>             <plugins>
>                 <plugin>
>                   <groupId>org.apache.maven.plugins</groupId>
>                   <artifactId>maven-compiler-plugin</artifactId>
>                   <version>3.8.1</version>
>                   <configuration>
>                       <annotationProcessorPaths>
>                           <path>
>                               <groupId>org.projectlombok</groupId>
>                               <artifactId>lombok</artifactId>
>                               <version>1.18.14</version>
>                           </path>
>                       </annotationProcessorPaths>
>                   </configuration>
>                 </plugin>
>             </plugins>
>         </pluginManagement>
>     </build>
> </project>
>
> And a child pom as
>
> <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.acme</groupId>
>         <artifactId>parent</artifactId>
>         <version>0.0.0</version>
>     </parent>
>
>     <artifactId>child</artifactId>
>
>     <build>
>         <plugins>
>             <plugin>
>               <groupId>org.apache.maven.plugins</groupId>
>               <artifactId>maven-compiler-plugin</artifactId>
>               <version>3.8.1</version>
>               <inherited>true</inherited>
>               <configuration>
>                   <annotationProcessorPaths>
>                       <path>
>                           <groupId>com.google.auto.value</groupId>
>                           <artifactId>auto-value</artifactId>
>                           <version>${auto-value.version}</version>
>                       </path>
>                   </annotationProcessorPaths>
>               </configuration>
>             </plugin>
>         </plugins>
>     </build>
> </project>
>
> The desired result when evaluating the child's pom is to have both Lombok
> and AutoValue (in that order) in the compiler's configuration. As it
> currently stands with Maven 3.6.3 only the child configuration is
> available, as shown by running `mvn help:effective-pom`
>
>       <plugin>
>         <artifactId>maven-compiler-plugin</artifactId>
>         <version>3.8.1</version>
>         <executions>
>           <execution>
>             <id>default-compile</id>
>             <phase>compile</phase>
>             <goals>
>               <goal>compile</goal>
>             </goals>
>             <configuration>
>               <annotationProcessorPaths>
>                 <path>
>                   <groupId>com.google.auto.value</groupId>
>                   <artifactId>auto-value</artifactId>
>                   <version>1.7.4</version>
>                 </path>
>               </annotationProcessorPaths>
>             </configuration>
>           </execution>
>           <execution>
>             <id>default-testCompile</id>
>             <phase>test-compile</phase>
>             <goals>
>               <goal>testCompile</goal>
>             </goals>
>             <configuration>
>               <annotationProcessorPaths>
>                 <path>
>                   <groupId>com.google.auto.value</groupId>
>                   <artifactId>auto-value</artifactId>
>                   <version>1.7.4</version>
>                 </path>
>               </annotationProcessorPaths>
>             </configuration>
>           </execution>
>         </executions>
>         <inherited>true</inherited>
>         <configuration>
>           <annotationProcessorPaths>
>             <path>
>               <groupId>com.google.auto.value</groupId>
>               <artifactId>auto-value</artifactId>
>               <version>1.7.4</version>
>             </path>
>           </annotationProcessorPaths>
>         </configuration>
>       </plugin>
>
> Cheers,
> Andres
>