[ https://jira.codehaus.org/browse/MNG-5408?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=339919#comment-339919 ]
Jason van Zyl commented on MNG-5408: ------------------------------------ I think a better idea here would be mixins: https://jira.codehaus.org/browse/MNG-5437 > Explicit profile activation in pom.xml > -------------------------------------- > > Key: MNG-5408 > URL: https://jira.codehaus.org/browse/MNG-5408 > Project: Maven 2 & 3 > Issue Type: Improvement > Components: Profiles > Affects Versions: 3.0.4 > Reporter: Paul Lowry > > +Background:+ > Organisations should be able to define complex maven tasks, each involving > multiple plugin executions, in a way that is standardised for use in all > projects. > The obvious solution would seem to be profiles: > * They allow us to define maven project configuration and multiple plugin > executions > * They can be enabled/disabled, and they are not mutually exclusive, so we > can use them to run execution A or execution B of the same plugin, or A and > then B, or any other sequence (note: this sort of control is not available in > pluginManagement) > For example, consider an organisation where some project teams do integration > testing of war artifacts by running them in Jetty, whereas others use Tomcat. > Both scenarios require several plugins to run, and though the process is > similar it is not the same (for our example, let's assume that Jetty requires > a test context file, and Tomcat projects have a different naming scheme for > their test classes). > Using profiles in a root pom, which is the parent for all projects in the > organisation, we can make the process for running a war in Jetty/Tomcat quite > simple, and more importantly quite consistent: > {code:xml|title=root.pom.xml} > <project> > <profiles> > <!-- > profile for running integration tests using jetty > --> > <profile> > <id>runJetty</id> > <build> > <plugins> > <plugin> > <groupId>org.apache.maven.plugins</groupId> > <artifactId>maven-resources-plugin</artifactId> > <executions> > <execution> > <id>runJetty.prep</id> > <phase>pre-integration-test</phase> > <goals> > <goal>copy-resources</goal> > </goals> > <configuration> > <resources> > <resource> > > <directory>\${project.build.testOutputDirectory}/jetty</directory> > <filtering>true</filtering> > </resource> > </resources> > > <outputDirectory>\${project.build.directory}/\${project.build.finalName}</outputDirectory> > </configuration> > </execution> > </executions> > </plugin> > <plugin> > <groupId>org.mortbay.jetty</groupId> > <artifactId>jetty-maven-plugin</artifactId> > <executions> > <execution> > <id>runJetty.start</id> > <phase>pre-integration-test</phase> > <!-- start server in jetty, using property > ${runJetty.port} --> > </execution> > <execution> > <id>runJetty.stop</id> > <phase>post-integration-test</phase> > <!-- stop jetty --> > </execution> > </executions> > </plugin> > <plugin> > <groupId>org.apache.maven.plugins</groupId> > <artifactId>maven-failsafe-plugin</artifactId> > <executions> > <execution> > <id>runJetty.test</id> > <phase>integration-test</phase> > <goals> > <goal>integration-test</goal> > <goal>verify</goal> > </goals> > </execution> > </executions> > </plugin> > </plugins> > </build> > </profile> > <!-- > profile for running integration tests using tomcat > --> > <profile> > <id>runTomcat</id> > <build> > <plugins> > <plugin> > <groupId>org.apache.tomcat.maven</groupId> > <artifactId>tomcat6-maven-plugin</artifactId> > <executions> > <execution> > <id>runTomcat.start</id> > <phase>pre-integration-test</phase> > <!-- start server in tomcat, using property > ${runTomcat.port} --> > </execution> > </executions> > </plugin> > <plugin> > <groupId>org.apache.maven.plugins</groupId> > <artifactId>maven-failsafe-plugin</artifactId> > <executions> > <execution> > <id>runTomcat.test</id> > <phase>integration-test</phase> > <goals> > <goal>integration-test</goal> > <goal>verify</goal> > </goals> > <configuration> > <includes> > > <include>\${runTomcat.testPattern}</include> > </includes> > </configuration> > </execution> > </executions> > </plugin> > </plugins> > </build> > </profile> > </profiles> > </project> > {code} > A war project, with the above as its parent, can be configured to start its > build artifact and run all integration tests, using Jetty or Tomcat as > follows: > {noformat:title=project tested using Jetty} > <project> > <properties> > <runJetty.port>7070</runJetty.port> > </properties> > </project> > {noformat} > {noformat:title=the same project tested using Tomcat} > <project> > <properties> > <runTomcat.port>7070</runTomcat.port> > <runTomcat.testPattern>**/*AcceptanceTest.java</runTomcat.testPattern> > </properties> > </project> > {noformat} > Having defined these re-usable profiles, we then reach the question of how to > activate them automatically in the organisation's various war projects (since > the organisation's best practices demand that every build of a war project > should run integration tests). > Profiles can be activated by JDK version or OS, but these are not specific > enough conditions. They can also be activated by command line properties, but > these are too explicit - in this case we want our profile to run > automatically. The only other activation condition is for a file to exist; > but we cannot look in the target directory because profile activation is > evaluated before the build starts; nor can we reliably depend on > 'src/main/webapp', since different projects may arrange their sources > differently, and some projects might want to disable the profile. > +Problem:+ > So we hit a problem, namely: A project should be able to activate a profile > explicitly; but the activation mechanisms provided out of the box are not > refined enough. > Several alternative ways have been suggested to activate profiles, such as > packaging type (http://jira.codehaus.org/browse/MNG-4154), artifactId/groupId > (http://jira.codehaus.org/browse/MNG-944), and pom properties. This last is > probably the most widely mentioned, and was even used as the example for a > custom profile activator feature, that was spiked in Maven 2.1 but never made > it into the product. See these links for details... > * > http://maven.40175.n5.nabble.com/Activating-a-profile-in-settings-xml-based-on-a-property-set-in-pom-xml-tp512562p512598.html > * > http://maven.40175.n5.nabble.com/profile-activation-based-on-property-properties-in-POM-tp88010p88011.html > * http://docs.codehaus.org/display/MAVEN/Custom+Profile+Activators > If pom properties could activate profiles, it would certainly work nicely for > the example above, in that developers could enable Jetty or Tomcat as follows: > {code:xml|title=root.pom.xml} > <project> > <profiles> > <profile> > <id>runJetty</id> > <activation> > <property> > <name>runJetty</name> > <value>true</value> > </property> > </activation> > ... > </profile> > <profile> > <id>runTomcat</id> > <activation> > <property> > <name>runTomcat</name> > <value>true</value> > </property> > </activation> > ... > </profile> > </profiles> > </project> > {code} > {noformat:title=project tested using Jetty} > <project> > <properties> > <runJetty>true</runJetty> > <runJetty.port>7070</runJetty.port> > </properties> > </project> > {noformat} > {noformat:title=the same project tested using Tomcat} > <project> > <properties> > <runTomcat>true</runTomcat> > <runTomcat.port>7070</runTomcat.port> > <runTomcat.testPattern>**/*AcceptanceTest.java</runTomcat.testPattern> > </properties> > </project> > {noformat} > However, none of these improvements (or similar) have ever been released. > It seems to me like I'm missing something. Maybe the Maven > developers/committers consider profiles an inappropriate way to configure > builds like the example above; or maybe it's just too costly to activate > profiles using info from the pom model. > +Summary:+ > I'd like very much to understand why profiles cannot (or should not) be used > in scenarios like the one described above. > I'd also like to know if John Casey's custom profile activator might ever see > the light of day, or if there is some alternative solution on the roadmap for > Maven. > Thanks & Regards -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira