17

I would like to breakup certain phases in the maven life cycle into sub phases. I would like to control the execution flow from one sub-phase to another, sort of like with ant dependencies.

For example, I would like to use the NSIS plugin in order to package up my project into an installer at the package stage, AFTER my project had been packaged into a war file. I would like to do all that at the package phase.

Is that possible?

Jonas
  • 121,568
  • 97
  • 310
  • 388
Yaneeve
  • 4,751
  • 10
  • 49
  • 87

2 Answers2

13

Plugins bound to the same phase should be executed in the same order as they are listed in the POM. Under certain circumstances (e.g. if you bind the same plugin to a phase twice, like the antrun plugin), this may not occur but this is a bug (see MNG-2258 and the related issue MNG-3719).

Pascal Thivent
  • 562,542
  • 136
  • 1,062
  • 1,124
  • but what if you specify them in unrelated blocks, such as the normal build block vs. a build block that's part of a profile block? There may be some plugins in the profile block that should run after those in the plugins block, but others may not. – mxk Nov 02 '11 at 10:37
  • 9
    This doesn't happen (at least in maven 3.0.4). I have two plugins with executions bound to generate-sources, one listed first in the list of about 6 plugins and the other listed last. However, the one listed last (which depends on the one listed first) always executes first. – matt5784 May 23 '12 at 18:32
  • Agree with matt5784, this is annoying :( – Hendy Irawan Jul 27 '12 at 23:51
  • Also agree with matt5784 on this one. Any known work arounds? – David Witherspoon Oct 26 '12 at 20:26
  • 1
    Work around: sort by desired order and reverse. Tested and works for me :) – Dormouse Apr 07 '14 at 11:33
  • 1
    The bugs listed are purportedly fixed in Maven 3.0.3. http://www.mkyong.com/maven/maven-plugin-execution-order-in-same-phase/ – Paul D. Eden Jul 11 '14 at 14:58
6

I had the same problem. look at How to perform ordered tasks in Maven2 build. for some reason the different goals bound to a phase are stored in a hash map or other unordered structure which makes the execution order random. my solution was to spread the tasks to different phases but I dont think there is much sence for it in your case (nsis packaging is not pre integration test). you could do one of the following:

1) try your luck and see if Maven chosses the right order for you (you probably tried that already)

2) use standalone plugin - run the goal outside the lifecycle. something like: mvn package org.codehaus.mojo:nsis-maven-plugin:1.0:compile.

3) separate them into module: have a parent pom containing two sub modules, one - your war project and the other for the nsis project.

4) use a custom lifecycle by changing the type, in your case you can use "exe". this is done by using a custom plugin extension (guide to using extension)

5) use the jetspeed-mvn-maven-plugin. I have never used it but it seems relevant to your needs.

hope this gives you new ideas.

Ronen

Community
  • 1
  • 1
rperez
  • 8,430
  • 11
  • 36
  • 44
  • Thanks, but except for some "kinks" with the default lifecycle @Pascal is right – Yaneeve Mar 25 '10 at 09:21
  • 1
    those are no "kinks". actually if you ask the Maven guys they'll tell you that number 3 is with best accordance with the "Maven way" that is the separation of modules and when you think about it, it make a lot of sense that creating a web application and an installer project are two separate things. – rperez Mar 25 '10 at 11:44