Christoph Läubrich created MNG-7510:
---------------------------------------

             Summary: Enhance AbstractMavenLifecycleParticipant to watch for 
buildProject events
                 Key: MNG-7510
                 URL: https://issues.apache.org/jira/browse/MNG-7510
             Project: Maven
          Issue Type: New Feature
            Reporter: Christoph Läubrich


Currently Tycho injects some dependencies into the maven model at a very early 
state. As this computation is time consuming, it has several drawbacks:

 
 # Even if one executes some goals that do not require the resolving of these 
artifacts, the computation is performed
 # If computation fails for one module the whole build fails, so flags like 
-fae are not really usable and implementing such support directly is very 
complex
 # If running a parallel build, the build can't start unless we have computed 
all modules

For this I have now prototype a new approach that only computes the absolute 
necessary parts and delays the heavy computation into a mojo called in the 
initialization phase of the life-cycle. This works quite well but currently 
requires some hacks:
 # I need to force maven to throw away all resolved state because otherwise 
later injected dependencies are missing, I'm currently use  
project.setDependencyArtifacts(null); for this but of course it feels like 
waste of throw away all the data and rely on internal behavior of maven
 # other maven tools are not aware of this (e.g. dependency:list) and if I 
execute such one, the user needs to add an explicitly manual mojo execution

Because of this, I like to discuss/suggest a way for a project scoped extension 
to participate in the collection of DependencyArtifacts.

For now, I found two possible "vectors":
 # DefaultProjectArtifactFactory currently converts Artifact out of the 
Dependency and it seems one might want to hook in here to provide additional 
Artifact/Dependency, but it seems to be to narrow to be useful in general.
 # LifecycleDependencyResolver.resolveProjectDependencies(MavenProject, 
Collection<String>, Collection<String>, MavenSession, boolean, Set<Artifact>)  
seems the most suitable place as it actually do the computation and checks.
 # LifecycleModuleBuilder#buildProject is actually the most valuable / generic 
place I think as it would also allow other use-cases where one want to get 
notified about a project build started, and as 
AbstractMavenLifecycleParticipant is abstract an extension here would even be 
backward-compatible and wont require any new interfaces/services/... to be 
created.

 

I'm in favor of option (3) but still wanted to still explain how I got there of 
course and feedback/ideas are appreciated! I'll try to provide a PR for (3) as 
well so one could maybe better discuss on the actual code changes.

 

 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to