Question

We have a multi module build with modules using different technologies, like Java and Flex. Is it somehow possible to activate different profiles based on the module that is compiled currently?

I tried it with an activation like

<profile>
  <id>flex</id>
  <activation>
    <file>
      <exists>${basedir}/src/main/flex</exists>
    </file>
  </activation>
  ...
</profile

But it didn't work, although the use of ${basedir} is documented in the Maven documentation (this is a bug in Maven). Is there a different possibility to have different activations based on the current module? Or does Maven only allow to activate a profile for all modules or not at all?

Was it helpful?

Solution

For those like myself reading this question looking for answers, this use case now works in Maven 3.

There is was a bug affecting this feature in early versions of 3 (see http://jira.codehaus.org/browse/MNG-2363) but it works for me correctly using Maven 3.0.4.

OTHER TIPS

After some more research I finally came to the conclusion that this is not possible for two reasons in the current Maven version (2.1.0):

  • Maven profiles are not inherited, so you can't define a profile in a parent POM and activate that in a child POM.
  • I haven't found a possibility to activate a profile from a POM itself. The activation does not work with ${basedir} and the property activation response only to system settings, which are globally specified through the -D option.

In 2.2.1, profiles are inherited but the ${basedir} issue is still there. I'm in the same boat - I need to activate a profile based on the existence of a file in a given project. My child builds run individually just fine (inherited profile activated by local file existance), but if I run the build from the top parent, they fail because the file isn't found.

With regard to file-based activation, you can try removing ${basedir}. We use it like this:

<activation>
   <file>
      <missing>target/jboss/conf/jboss-service.xml</missing>
   </file>
</activation>

I dont know if this helps, but I solved a similar problem with the following approach:

  1. I created and described the profile in the parent POM, which has activeByDefault=false. The PluginManagement-Section then contains the configurations for different plugins.
  2. The children can reuse this profile, and set activeByDefault=true This makes the profile active, but still none of the plugins are activated.
  3. But fortunately the described plugin configurations are available. You can reuse them in children by defining them in the Plugins-Section. You just provide the group- and the artifactID, and set inherited=true for each plugin you want to reuse in the children.

I hope that helps. Sorry for not including any code snippets, but I hope even so the soutions is understandable.

You can set a property in each module that you want to use the profile, and then use "property" activation in your profiles.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top