Package hudson.maven
General Idea
One of the pain points of the freestyle project is that you have to configure a lot of things, such as where to look for test reports, what files to archive, where the findbugs report would go. But if we focus on Maven, we should be able to eliminate much of the configuration, since it introduces more uniform structures. So that's what this plugin does — at the expense of limiting the build tool to Maven, automate much of the configuration.
Implementation Approach
The core idea of the implementation is to monitor what Maven does, so that we can see which mojos are executed with what parameters. In this way, we can tell when/where javadoc is generated, if source code compilation had an error, and access other rich information about the project build process.
To make communication between Hudson JVM and Maven JVM easier, we use the remoting technology that Hudson uses between the controller and the agent. We start a new JVM and bootstraps to the remoting, then use a socket to establish a connection to this process. This part of the code is in the "maven-agent" module. We then bootstrap Maven.
To intercept what's going on in Maven, we extend some key components in Maven, and configure Plexus in such a way that our components are used instead of default ones. Because injected components need to live in a different classloader, they are packaged in a separate "maven-interceptor" module. We also bring in objects (MavenReporters) from plugins via remoting, and distribute intercepted events to these guys. They can then digest information and send it back to Hudson JVM.
In addition to all this, we use embedded Maven to parse POMs, so that we can figure out the structure of the project before we even do a build (this information is used for example to set up dependencies among jobs.) This turns out to be rather fragile (in the presence of profiles that are activated by system property, platform, etc., which makes the effective POM different when in Hudson vs when built for real.)
-
Interface Summary Interface Description AggregatableAction Indicates that thisAction
forMavenBuild
contributes an "aggregated" action toits governing MavenModuleSetBuild
.MavenAggregatedReport Action
to be associated withMavenModuleSetBuild
, which usually displays some aspect of the aggregated results of the module builds (such as aggregated test result, aggregated coverage report, etc.)MavenArgumentInterceptorAction Provides a hook to change the arguments passed to the maven execution.MavenBuildProxy Remoting proxy interface forMavenReporter
s to talk toMavenBuild
during the build.MavenBuildProxy.BuildCallable<V,T extends Throwable> MavenBuildProxy2 A part ofMavenBuildProxy
that's used internally for aggregated build.MavenProjectActionBuilder Can contribute to project actions. -
Class Summary Class Description AbstractMavenBuild<P extends AbstractMavenProject<P,B>,B extends AbstractMavenBuild<P,B>> AbstractMavenBuilder AbstractMavenBuilder.FilterImpl AbstractMavenProcessFactory Launches the maven process.AbstractMavenProcessFactory.GetRemotingJar AbstractMavenProcessFactory.UserInetTcpSocketHostLocator AbstractMavenProject<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>> Common part betweenMavenModule
andMavenModuleSet
.AbstractMavenProject.MavenModuleDependency ExecutedMojo Persisted record of mojo execution.ExecutedMojo.Cache Used during the HTML rendering to cache the index.FilteredChangeLogSet ChangeLogSet
implementation used forMavenBuild
.Maven31ProcessFactory AbstractMavenProcessFactory
for Maven 3.Maven32ProcessFactory AbstractMavenProcessFactory
for Maven 3.2.xMaven33ProcessFactory AbstractMavenProcessFactory
for Maven 3.3.xMaven35ProcessFactory AbstractMavenProcessFactory
for Maven 3.5.xMaven3Builder Maven3Builder.Maven3BuilderRequest Maven3ProcessFactory AbstractMavenProcessFactory
for Maven 3.Maven3ProcessFactory.GetClassWorldsJar Finds classworlds.jarMavenBuild Run
forMavenModule
.MavenBuilder Callable
that invokes Maven CLI (in process) and drives a build.MavenBuildInformation MavenBuildProxy.Filter<CORE extends MavenBuildProxy> Filter forMavenBuildProxy
.MavenBuildProxy.Filter.AsyncInvoker Callable
for invokingMavenBuildProxy.BuildCallable
asynchronously.MavenBuildProxy2.Filter<CORE extends MavenBuildProxy2> Filter forMavenBuildProxy2
.MavenEmbedderRequest MavenModule Job
that builds projects based on Maven2.MavenModuleSet Group ofMavenModule
s.MavenModuleSet.DescriptorImpl MavenModuleSetBuild Build
forMavenModuleSet
.MavenModuleSetBuild.SimpleTransferListener will log in theTaskListener
when transferFailed and transferSucceededMavenProbeAction UI for probing Maven process.MavenReporter Listens to the build execution ofMavenBuild
, and normally records some information and exposes thoses inMavenBuild
later.MavenReporterDescriptor Descriptor
forMavenReporter
.MavenReporters MavenReportInfo Information aboutMavenReport
that was executed.MavenTestDataPublisher AugmentsSurefireReport
by executingTestDataPublisher
s.MavenTestDataPublisher.DescriptorImpl MavenUtil MavenVersionCallable Messages Generated localization support class.ModuleDependency group id + artifact id + version and a flag to know if it's a pluginModuleName Version independent name of a Maven project.MojoInfo Information about Mojo to be executed.MojoInfo.Maven3ProvidesNoAccessToMojo Instance will be set toMojoInfo.mojo
to avoid NPE in plugins.NeedsFullBuildAction Action signalling that thisMavenModuleSet
needs a full build on the next run even if it's marked as an incremental build.PlexusModuleContributor Contributes additional code into Plexus container when we run Maven.PlexusModuleContributorFactory Contributes additional code into Plexus container when we run Maven.PluginImpl PluginName Identifier of a specific version of a Maven plugin that consists of groupId, artifactId, and version.ProcessCache Hold on to launched Maven processes so that multiple builds can reuse the same Maven JVM, which leads to improved performance.ProcessCache.NewProcess RedeployPublisher Publisher
forMavenModuleSetBuild
to deploy artifacts after a build is fully succeeded.RedeployPublisher.DescriptorImpl RedeployPublisher.WrappedArtifactRepository TcpSocketHostLocator Identify the Host name to use from maven-agent to connect to to Jenkins agent TCP socket.UnbuiltModuleAction Action which remembers all module which have not been built since the last successful build though they should have been, because they have SCM changes since then. -
Enum Summary Enum Description MavenUtil.MavenVersion