[ http://jira.codehaus.org/browse/MNG-1462?page=all ]
     
John Casey closed MNG-1462:
---------------------------

    Resolution: Fixed

applied. Thanks, Jerome.

> assembly:assembly forks a lifecycle and cannot be used in a reactor 
> environment. Need a new mojo suitable for this environment,
> -------------------------------------------------------------------------------------------------------------------------------
>
>          Key: MNG-1462
>          URL: http://jira.codehaus.org/browse/MNG-1462
>      Project: Maven 2
>         Type: Improvement
>   Components: maven-assembly-plugin
>     Versions: 2.0
>     Reporter: Jerome Lacoste
>     Assignee: John Casey
>     Priority: Critical
>      Fix For: 2.0.1
>  Attachments: MNG-1462-attached_mojo_for_assembly_plugin.diff
>
> Original Estimate: 30 minutes
>         Remaining: 30 minutes
>
> Basically I use the assembly plugin in a module under the reactor project. 
> I attach the assembly plugin to the verify phase (because of MNG-1311), but 
> somehow when my module is being processed, the plugin is executed for the 
> package phase and it 
> forks the full project lifecycle, because it is an aggregator. 
> This triggers the rebuild all my reactor projects. 
>  
> This happens twice (I have 2 modules which use the assembly plugin), 
> making my build 3 times too long.
>  
>  
>  
> Now investigating the issue. 
>  
> The stack trace looks like:
>  
> private void executeGoalAndHandleFailures( String task, MavenSession session, 
> MavenProject project,
>                                            EventDispatcher dispatcher, String 
> event, ReactorManager rm,
>                                            long buildStartTime, String target 
> )
>  
> private void executeGoal( String task, MavenSession session, MavenProject 
> project )
>  
> private void executeGoalWithLifecycle( String task, MavenSession session, Map 
> lifecycleMappings,
>                                            MavenProject project, Lifecycle 
> lifecycle )
>  
> private void executeGoals( List goals, MavenSession session, MavenProject 
> project )
>     throws LifecycleExecutionException, BuildFailureException, 
> PluginNotFoundException
>  
> private void forkLifecycle( MojoDescriptor mojoDescriptor, MavenSession 
> session, MavenProject project )
>      throws LifecycleExecutionException, BuildFailureException, 
> PluginNotFoundException
>  
> which creates the redundancy here:
>  
>     private void forkLifecycle( MojoDescriptor mojoDescriptor, MavenSession 
> session, MavenProject project )
>         throws LifecycleExecutionException, BuildFailureException, 
> PluginNotFoundException
>     {
>         PluginDescriptor pluginDescriptor = 
> mojoDescriptor.getPluginDescriptor();
>         getLogger().info( "Preparing " + pluginDescriptor.getGoalPrefix() + 
> ":" + mojoDescriptor.getGoal() );
>  
>         if ( mojoDescriptor.isAggregator() )
>         {
>             for ( Iterator i = session.getSortedProjects().iterator(); 
> i.hasNext(); )
>             {
>                 MavenProject reactorProject = (MavenProject) i.next();
>  
>                 line();
>  
>                 getLogger().info( "Building " + reactorProject.getName() );
>  
>                 line();
>  
>                 forkProjectLifecycle( mojoDescriptor, session, reactorProject 
> );
>             }
>         }
>         else
>         {
>             forkProjectLifecycle( mojoDescriptor, session, project );
>         }
>     }
>  
>  
> The redundancy appears because the assembly plugin is an aggregator so if 
> forked it will fork all reactor projects. 
>  
> It is forked in my case because the execute phase is not null.
>  
> In DefaultLifeCycleExecutor:
>  
>     private void executeGoals( List goals, MavenSession session, MavenProject 
> project )
>         throws LifecycleExecutionException, BuildFailureException, 
> PluginNotFoundException
>     {
>         for ( Iterator i = goals.iterator(); i.hasNext(); )
>         {
>             MojoExecution mojoExecution = (MojoExecution) i.next();
>  
>             MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
>  
>             if ( mojoDescriptor.getExecutePhase() != null || 
> mojoDescriptor.getExecuteGoal() != null )
>             {
>                 forkLifecycle( mojoDescriptor, session, project );
>             }
>  
>  
> and getExecutePhase() is "package"
>  
> Now before executing this:
>  
>                 Map lifecycleMappings = constructLifecycleMappings( session, 
> task, project, lifecycle );
>                 executeGoalWithLifecycle( task, session, lifecycleMappings, 
> project, lifecycle );
>  
>  
> my lifecycleMappings contains 3 entries each with a list of single 
> MojoExecution instances
>  
> install -> ME21
> verify -> MJ17
> test -> MJ20
>  
>  
> Then when this mappings are processed as a goal chain:
>  
> List goals = processGoalChain( task, lifecycleMappings, lifecycle );
>  
> The goals have been sorted so that:
>  
> (MJ20, MJ17, MJ21) which looks OK to me.
>  
> which were constructed by:
>  
>  
>     private Map constructLifecycleMappings( MavenSession session, String 
> selectedPhase, MavenProject project,
>                                             Lifecycle lifecycle )
>         throws LifecycleExecutionException, BuildFailureException, 
> PluginNotFoundException
>     {
>         // first, bind those associated with the packaging
>         Map lifecycleMappings = bindLifecycleForPackaging( session, 
> selectedPhase, project, lifecycle );
>  
>         // next, loop over plugins and for any that have a phase, bind it
>         for ( Iterator i = project.getBuildPlugins().iterator(); i.hasNext(); 
> )
>         {
>             Plugin plugin = (Plugin) i.next();
>  
>             bindPluginToLifecycle( plugin, session, lifecycleMappings, 
> project );
>         }
>  
>         return lifecycleMappings;
>     }
>  
> Links to a somewhat related issue: http://jira.codehaus.org/browse/MNG-1311
> Now a little chat with jdcasey conclude that a new Mojo needs to be created:
> (18:02:35) jdcasey: CoffeeBre: it doesn't seem to have anything to do with it 
> being an aggregator...it's all based on that @execute phase="package" 
> annotation
> (18:02:48) jdcasey: that prompts the lifecycle executor to fork the 
> lifecycle, and re-run package
> (18:02:50) jdcasey: hmm
> (18:03:49) jdcasey: looks like this mojo isn't designed to be integrated into 
> the lifecycle
> (18:04:13) jdcasey: it looks like you'd have to write another mojo front-end 
> for the assembly process, which doesn't specify @execute phase="package" in 
> it.
> (18:04:49) jdcasey: the mojo could be a thin wrapper around the real guts, 
> which would be in a separate class
> (18:05:15) jdcasey: I think that would be the simplest way around.
> (18:05:43) ***jdcasey thinks the @execute annotation is poorly named...
> (18:05:46) CoffeeBre: what about removing the @execute phase instaed?
> (18:06:02) jdcasey: well, then you lose the ability to call 'mvn 
> assembly:assembly'
> (18:06:10) jdcasey: because it requires the package phase.
> (18:07:04) jdcasey: something like assembly:attached would be good, 
> IMO...that's what you want to do, right? attach them to the main project 
> artifact so they're installed/deployed too?
> (18:07:27) jdcasey: that new mojo could reference the same code, which would 
> be factored into a general case api in that plugin
> (18:07:34) CoffeeBre: and with regard to the aggregator, I mentionned it 
> because of line 701 in DefaultLifeCycleExecutor
> (18:08:02) jdcasey: yeah, but if you look, that just determines *how* the 
> lifecycle is forked, not *whether*
> (18:08:32) CoffeeBre: you mean it shouldn't be forked at all? (I am trying to 
> follow)
> (18:10:42) jdcasey: CoffeeBre: you need a new mojo that integrates with the 
> existing lifecycle, but has to bind on or after the package phase...rather 
> than forking
> (18:11:57) CoffeeBre: jdcasey: see also MNG-1310 and MNG-1274. related to my 
> use of the assembly plugin
> (18:16:53) CoffeeBre: jdcasey: trying to summarize. If I follow you, the 
> issue is because the assembly:assembly mojo is forking and we don't want 
> that. So I create a simple Mojo wrapper within the assembly plugin with 2 
> differences. Map to assembly:attached, and do not specify a @execute. Could 
> that be the solution for MNG-1311 as well?
> (18:17:45) jdcasey: CoffeeBre: that won't solve MNG-1311, because we need to 
> eliminate the infinite loop (thought I worked on that once already)
> (18:18:16) jdcasey: CoffeeBre: you may need to factor some logic out of the 
> existing AssemblyMojo into a common class, or extend it (not sure whether the 
> annotations will show through when extending)
> (18:18:41) jdcasey: if you factor into common API, and reference from both 
> the AssemblyMojo and the new AttachedAssemblyMojo (or whatever) it'll 
> definitely work
> (18:18:56) jdcasey: but the new mojo should *not* specify the execute stuff
> (18:19:46) jdcasey: CoffeeBre, jeremyw: I've gotta run out for a bit, but 
> I'll be back in like an hour or so
> (18:19:58) CoffeeBre: jdcasey: I wondered if the infinite loop was not 
> created by the fact that the plugin was aggregating all the projects 
> (18:20:35) jdcasey: CoffeeBre: um, possibly...but I think aggregation is 
> appropriate here...not sure, I'd have to investigate further.
> (18:20:49) CoffeeBre: jdcasey: ok. Have to run out as well. Will create an 
> issue and add info there.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to