Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Maven - activate child profile based on property

Scenario:

  1. Given
    1. Parent POM which defines a profile and a child (as module)
    2. Child project(s) that will be using the profile by referring to the parent POM.
  2. The intent is to skip profile execution in the parent and execute it in the child only
  3. Profile has activation section <activation><property><name>foo</name></property><activation>
  4. Since parent does not define foo property - the profile is inactive and will not be executed for the parent build
  5. Now, I'm defining <properties><foo>true</foo></properties> in the child with hope that the property will be picked up when child build is executed and profile will be activated. No such luck. Profile is never activated, which tells me that property is never set.
  6. Just to note: mvn package -Dfoo=true activates profile in both parent and child

Am I trying to do the impossible or just doing it wrong?

P.S. Hmmm - even if I define property in the parent, the profile is not triggered. What gives?

like image 358
Bostone Avatar asked Oct 01 '09 16:10

Bostone


People also ask

How do I run a specific profile in Maven?

Open Maven settings. m2 directory where %USER_HOME% represents the user home directory. If settings. xml file is not there, then create a new one. Add test profile as an active profile using active Profiles node as shown below in example.

Can Maven profile be defined in POM xml?

A profile in Maven is an alternative set of configuration values which set or override default values. Using a profile, you can customize a build for different environments. Profiles are configured in the pom. xml and are given an identifier.


1 Answers

To expand on @rich-seller's answer, and @Bostone's self-answer, it seems to be impossible to have a setup where the parent POM defines a few profiles as alternatives, and child POMs select one of these profiles by default, while allowing you to override the choice for a child temporarily (i.e. on the CLI). Consider a parent POM for projects which use some framework and an associated plugin, both of whose versions we can assume are defined by properties:

<profiles>   <profile>     <id>newest</id>     <activation>       <activeByDefault>true</activeByDefault>     </activation>     <properties>       <framework.version>2.0</framework.version>       <plugin.version>2.0</plugin.version>     </properties>   </profile>   <profile>     <id>older</id>     <activation>       <property>         <name>older.framework</name>         <value>true</value>       </property>     </activation>     <properties>       <framework.version>1.1</framework.version>       <plugin.version>1.1</plugin.version>     </properties>   </profile> </profiles> 

Now a child inheriting from this parent POM by default will use 2.0 as you would expect, and -Polder or -Dolder.framework=true will work to try building it with the older framework (e.g. to test compatibility). However you cannot write in the child POM

<properties>   <older.framework>true</older.framework> </properties> 

and have the older profile be activated automatically. You could use file-based activation to make this module build against 1.1 if newest were not active by default, but then it is not easy to temporarily run it against 2.0: as far as I know both older and newest profiles would be active if you passed -Pnewest, so you need to explicitly disable other profiles which is unreasonable if you have a dozen of them. So there is just no solution except to copy the profile information to the child POM:

<properties>   <framework.version>1.1</framework.version>   <plugin.version>1.1</plugin.version> </properties> 

at which point -Pnewest will not work to override these properties, so you need to use -Dframework.version=2.0 -Dplugin.version=2.0.

In other words, the profiles are only useful if all the child modules can use the same profile (here newest) by default. If some of them are normally built with 1.1 and some with 2.0, the profiles are useless.

Seems like this is a use case for a Maven core enhancement, or perhaps a Maven 3 build extension. http://docs.codehaus.org/display/MAVEN/Custom+Profile+Activators and https://github.com/maoo/maven-tiles come to mind.

like image 90
Jesse Glick Avatar answered Oct 01 '22 21:10

Jesse Glick