Hi,

I recently discovered an issue between the "deployAtEnd" option of 
"maven-deploy-plugin" and the execution of my plugin
"ant-assembly-maven-plugin" (based on Aether).

I first though it had nothing to do with maven-deploy-plugin and revealed a 
more general issue in my implementation, so
I posted on Aether mailing list [0] but Benjamin Bentmann answered it could be 
a bug in the maven-deploy-plugin
implementation of deployAtEnd option [1]:
>> Aether has nothing to do with the way Maven manages class loaders for 
>> plugins, i.e. you should reach out to the Maven
user list instead.
>> Also, your analysis suggests a bug in the maven-deploy-plugin in that it 
>> relies on the erroneous assumption that a
single class loader is used per plugin through out a multi-module build.

Here it the issue: the deployAtEndoption doesn't work after building a module 
involving an execution of
ant-assembly-maven-pluginbecause a new "Class realm plugin" is then created and 
its static fields are reset (in that
case, the org.apache.maven.plugin.deploy.DeployMojo.readyProjectsCounterfield).

Code from maven-deploy-plugin(readyProjectsCounterrestarted to zero will never 
equal to reactorProjects.size(),
projectsReadywill be always false):

    @Parameter( defaultValue = "${reactorProjects}", required = true, readonly 
= true )
    private List<MavenProject> reactorProjects;

    private static final AtomicInteger readyProjectsCounter = new 
AtomicInteger();

*    *org.apache.maven.plugin.deploy.DeployMojo.execute() {
        boolean projectsReady = readyProjectsCounter.incrementAndGet() == 
reactorProjects.size();


In the following sample case, the ant-assembly-maven-plugin is called by the 
"nuxeo-distribution-resources" module.
After that, no deployment will ever happen since the static fields of 
maven-deploy-plugin are reset, the counter
"readyProjectsCounter" restarted to zero will never reach the number of 
"reactorProjects", "projectsReady" will be
always false:

$ mvn clean deploy -Pqa -DskipTests -pl 
nuxeo-functional-tests,nuxeo-launcher,nuxeo-distribution-resources -nsu -X|grep 
maven-deploy-plugin

[DEBUG] Goal:          
org.apache.maven.plugins:maven-deploy-plugin:2.8.1:deploy (default-deploy)
[INFO] --- maven-deploy-plugin:2.8.1:deploy (default-deploy) @ 
nuxeo-functional-tests ---
[DEBUG] org.apache.maven.plugins:maven-deploy-plugin:jar:2.8.1:
[DEBUG] *Created new class realm 
plugin>org.apache.maven.plugins:maven-deploy-plugin:2.8.1*
[DEBUG] Importing foreign packages into class realm 
plugin>org.apache.maven.plugins:maven-deploy-plugin:2.8.1
[DEBUG] Populating class realm 
plugin>org.apache.maven.plugins:maven-deploy-plugin:2.8.1
[DEBUG]   Included: org.apache.maven.plugins:maven-deploy-plugin:jar:2.8.1
[DEBUG] Configuring mojo 
org.apache.maven.plugins:maven-deploy-plugin:2.8.1:deploy from plugin realm 
ClassRealm[plugin>org.apache.maven.plugins:maven-deploy-plugin:2.8.1, parent: 
sun.misc.Launcher$AppClassLoader@4821e115]
[DEBUG] Configuring mojo 
'org.apache.maven.plugins:maven-deploy-plugin:2.8.1:deploy' with basic 
configurator -->
[DEBUG] Goal:          
org.apache.maven.plugins:maven-deploy-plugin:2.8.1:deploy (default-deploy)

[INFO] --- maven-deploy-plugin:2.8.1:deploy (default-deploy) @ nuxeo-launcher 
---
[DEBUG] Configuring mojo 
org.apache.maven.plugins:maven-deploy-plugin:2.8.1:deploy from plugin realm 
ClassRealm[plugin>org.apache.maven.plugins:maven-deploy-plugin:2.8.1, parent: 
sun.misc.Launcher$AppClassLoader@4821e115]
[DEBUG] Configuring mojo 
'org.apache.maven.plugins:maven-deploy-plugin:2.8.1:deploy' with basic 
configurator -->
[DEBUG] Goal:          
org.apache.maven.plugins:maven-deploy-plugin:2.8.1:deploy (default-deploy)

[INFO] --- maven-deploy-plugin:2.8.1:deploy (default-deploy) @ 
nuxeo-distribution-resources ---
[DEBUG] org.apache.maven.plugins:maven-deploy-plugin:jar:2.8.1:
[DEBUG] *Created new class realm 
plugin>org.apache.maven.plugins:maven-deploy-plugin:2.8.1--724569306*
[DEBUG] Importing foreign packages into class realm 
plugin>org.apache.maven.plugins:maven-deploy-plugin:2.8.1--724569306
[DEBUG] Populating class realm 
plugin>org.apache.maven.plugins:maven-deploy-plugin:2.8.1--724569306
[DEBUG]   Included: org.apache.maven.plugins:maven-deploy-plugin:jar:2.8.1
[DEBUG] Configuring mojo 
org.apache.maven.plugins:maven-deploy-plugin:2.8.1:deploy from plugin realm 
ClassRealm[plugin>org.apache.maven.plugins:maven-deploy-plugin:2.8.1--724569306,
 parent: sun.misc.Launcher$AppClassLoader@4821e115]
[DEBUG] Configuring mojo 
'org.apache.maven.plugins:maven-deploy-plugin:2.8.1:deploy' with basic 
configurator -->

Could someone explain or guess why/when a "new class realm 
plugin>org.apache.maven.plugins:maven-deploy-plugin" is
created (in bold) instead of reusing the previous one?
Is there something wrong in my implementation about that? Or should I rather 
create an
http://jira.codehaus.org/browse/MDEPLOY issue related to MDEPLOY-157?
 
The full log of above reproduction case: 
http://ubuntuone.com/0WeyQGBzaDacZWh97CwcvE
The ant-assembly-maven-plugin source code: 
https://github.com/nuxeo/ant-assembly-maven-plugin
Issue management:
- https://jira.nuxeo.com/browse/NXBT-739 (Do not break depoyAtEnd option of 
maven-deploy-plugin)
- http://jira.codehaus.org/browse/MDEPLOY-157 (Add deployAtEnd option for 
multimodule projects)

Thanks,

[0] http://dev.eclipse.org/mhonarc/lists/aether-users/msg00385.html
[1] http://dev.eclipse.org/mhonarc/lists/aether-users/msg00386.html


-- 

*Julien Carsique*
DevOps Nuxeo, Paris, France

Reply via email to