New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[MINSTALL-115] Install At End feature (no extension) #15
Changes from 15 commits
06d10f9
c08a736
4b03381
245f135
aded185
cf070a2
f03c4bf
3c1da73
4cecdff
b73cce7
10c039f
af0323d
98065bf
761fd38
d292de9
b6cd186
63aa94e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -20,19 +20,18 @@ | |
*/ | ||
|
||
import java.io.IOException; | ||
import java.util.ArrayList; | ||
import java.util.Collections; | ||
import java.util.List; | ||
import java.util.concurrent.atomic.AtomicInteger; | ||
import java.util.Map; | ||
|
||
import org.apache.maven.execution.MavenSession; | ||
import org.apache.maven.plugin.MojoExecutionException; | ||
import org.apache.maven.plugin.MojoFailureException; | ||
import org.apache.maven.plugin.descriptor.PluginDescriptor; | ||
import org.apache.maven.plugins.annotations.Component; | ||
import org.apache.maven.plugins.annotations.LifecyclePhase; | ||
import org.apache.maven.plugins.annotations.Mojo; | ||
import org.apache.maven.plugins.annotations.Parameter; | ||
import org.apache.maven.project.MavenProject; | ||
import org.apache.maven.project.ProjectBuildingRequest; | ||
import org.apache.maven.shared.transfer.artifact.install.ArtifactInstallerException; | ||
import org.apache.maven.shared.transfer.project.NoFileAssignedException; | ||
import org.apache.maven.shared.transfer.project.install.ProjectInstaller; | ||
|
@@ -48,24 +47,20 @@ | |
public class InstallMojo | ||
extends AbstractInstallMojo | ||
{ | ||
private static final String INSTALL_PROCESSED_MARKER = InstallMojo.class.getName() + ".processed"; | ||
|
||
/** | ||
* When building with multiple threads, reaching the last project doesn't have to mean that all projects are ready | ||
* to be installed | ||
*/ | ||
private static final AtomicInteger READYPROJECTSCOUNTER = new AtomicInteger(); | ||
|
||
private static final List<ProjectInstallerRequest> INSTALLREQUESTS = | ||
Collections.synchronizedList( new ArrayList<ProjectInstallerRequest>() ); | ||
|
||
/** | ||
*/ | ||
@Parameter( defaultValue = "${project}", readonly = true, required = true ) | ||
private MavenProject project; | ||
|
||
@Parameter( defaultValue = "${reactorProjects}", required = true, readonly = true ) | ||
private List<MavenProject> reactorProjects; | ||
|
||
@Parameter( defaultValue = "${session}", required = true, readonly = true ) | ||
private MavenSession session; | ||
|
||
@Parameter( defaultValue = "${plugin}", required = true, readonly = true ) | ||
private PluginDescriptor pluginDescriptor; | ||
|
||
/** | ||
* Whether every project should be installed during its own install-phase or at the end of the multimodule build. If | ||
* set to {@code true} and the build fails, none of the reactor projects is installed. | ||
|
@@ -88,56 +83,71 @@ public class InstallMojo | |
@Component | ||
private ProjectInstaller installer; | ||
|
||
private enum State | ||
{ | ||
SKIPPED, INSTALLED, TO_BE_INSTALLED | ||
} | ||
|
||
public void execute() | ||
throws MojoExecutionException, MojoFailureException | ||
{ | ||
boolean addedInstallRequest = false; | ||
if ( skip ) | ||
{ | ||
getLog().info( "Skipping artifact installation" ); | ||
getPluginContext().put( INSTALL_PROCESSED_MARKER, State.SKIPPED.name() ); | ||
} | ||
else | ||
{ | ||
// CHECKSTYLE_OFF: LineLength | ||
ProjectInstallerRequest projectInstallerRequest = | ||
new ProjectInstallerRequest().setProject( project ); | ||
// CHECKSTYLE_ON: LineLength | ||
|
||
if ( !installAtEnd ) | ||
{ | ||
installProject( session.getProjectBuildingRequest(), projectInstallerRequest ); | ||
installProject( project ); | ||
getPluginContext().put( INSTALL_PROCESSED_MARKER, State.INSTALLED.name() ); | ||
} | ||
else | ||
{ | ||
INSTALLREQUESTS.add( projectInstallerRequest ); | ||
addedInstallRequest = true; | ||
getLog().info( "Installing " + getProjectReferenceId( project ) + " at end" ); | ||
getPluginContext().put( INSTALL_PROCESSED_MARKER, State.TO_BE_INSTALLED.name() ); | ||
} | ||
} | ||
|
||
boolean projectsReady = READYPROJECTSCOUNTER.incrementAndGet() == reactorProjects.size(); | ||
if ( projectsReady ) | ||
if ( allProjectsMarked() ) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does this work if the last project being built does not have a standard lifecycle ? Or maybe this does not exist ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If m-install-p is not present, will not, but all "standard" life-cycle has them. But true, if no m-install-p not present, will not work. Was thinking about There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Neglect that above. Instead: this does NOT modify the existing feature (when it forced you to use plugin as extension), and will fix this in some newer PR There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
is this a pure theoretical question (legit when thinking, but...)? Or do you know any concrete case? IMHO, the best we can do is to add a note in plugins' parameter documentation (and it's not really about "standard lifecycle" but having install goal also run in the last reactor project) |
||
{ | ||
synchronized ( INSTALLREQUESTS ) | ||
for ( MavenProject reactorProject : reactorProjects ) | ||
{ | ||
while ( !INSTALLREQUESTS.isEmpty() ) | ||
Map<String, Object> pluginContext = session.getPluginContext( pluginDescriptor, reactorProject ); | ||
State state = State.valueOf( (String) pluginContext.get( INSTALL_PROCESSED_MARKER ) ); | ||
if ( state == State.TO_BE_INSTALLED ) | ||
{ | ||
installProject( session.getProjectBuildingRequest(), INSTALLREQUESTS.remove( 0 ) ); | ||
installProject( reactorProject ); | ||
} | ||
} | ||
} | ||
else if ( addedInstallRequest ) | ||
} | ||
|
||
private String getProjectReferenceId( MavenProject mavenProject ) | ||
{ | ||
return mavenProject.getGroupId() + ":" + mavenProject.getArtifactId() + ":" + mavenProject.getVersion(); | ||
} | ||
|
||
private boolean allProjectsMarked() | ||
{ | ||
for ( MavenProject reactorProject : reactorProjects ) | ||
{ | ||
getLog().info( "Installing " + project.getGroupId() + ":" + project.getArtifactId() + ":" | ||
+ project.getVersion() + " at end" ); | ||
Map<String, Object> pluginContext = session.getPluginContext( pluginDescriptor, reactorProject ); | ||
if ( !pluginContext.containsKey( INSTALL_PROCESSED_MARKER ) ) | ||
{ | ||
return false; | ||
} | ||
} | ||
return true; | ||
} | ||
|
||
private void installProject( ProjectBuildingRequest pbr, ProjectInstallerRequest pir ) | ||
private void installProject( MavenProject pir ) | ||
throws MojoFailureException, MojoExecutionException | ||
{ | ||
try | ||
{ | ||
installer.install( session.getProjectBuildingRequest(), pir ); | ||
installer.install( session.getProjectBuildingRequest(), new ProjectInstallerRequest().setProject( pir ) ); | ||
} | ||
catch ( IOException e ) | ||
{ | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we have objects, why not retain the enum, why use name?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These span across several classloaders, there is no single enum.