Dependency report fails on system-scope dependencies
----------------------------------------------------
Key: MPIR-132
URL: http://jira.codehaus.org/browse/MPIR-132
Project: Maven 2.x Project Info Reports Plugin
Issue Type: Bug
Components: dependencies
Affects Versions: 2.1
Reporter: Kohsuke Kawaguchi
If a project includes a dependency to the system-scope artifact (such as
tools.jar), the dependency report generation fails with NPE.
MPIR-37 is probably the same issue, but I couldn't reopen it.
{noformat}
java.lang.NullPointerException
at
org.apache.maven.artifact.resolver.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:92)
at
org.apache.maven.artifact.resolver.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:73)
at
org.apache.maven.project.DefaultMavenProjectBuilder.findModelFromRepository(DefaultMavenProjectBuilder.java:526)
at
org.apache.maven.project.DefaultMavenProjectBuilder.buildFromRepository(DefaultMavenProjectBuilder.java:234)
at
org.apache.maven.report.projectinfo.dependencies.RepositoryUtils.getMavenProjectFromRepository(RepositoryUtils.java:316)
at
org.apache.maven.report.projectinfo.dependencies.renderer.DependenciesRenderer.renderSectionDependencyRepositoryLocations(DependenciesRenderer.java:623)
at
org.apache.maven.report.projectinfo.dependencies.renderer.DependenciesRenderer.renderBody(DependenciesRenderer.java:274)
at
org.apache.maven.reporting.AbstractMavenReportRenderer.render(AbstractMavenReportRenderer.java:65)
at
org.apache.maven.report.projectinfo.DependenciesReport.executeReport(DependenciesReport.java:239)
at
org.apache.maven.reporting.AbstractMavenReport.generate(AbstractMavenReport.java:90)
at
org.apache.maven.plugins.site.ReportDocumentRenderer.renderDocument(ReportDocumentRenderer.java:139)
at
org.apache.maven.doxia.siterenderer.DefaultSiteRenderer.renderModule(DefaultSiteRenderer.java:269)
at
org.apache.maven.doxia.siterenderer.DefaultSiteRenderer.render(DefaultSiteRenderer.java:101)
at
org.apache.maven.plugins.site.SiteMojo.renderLocale(SiteMojo.java:133)
at
org.apache.maven.plugins.site.SiteMojo.execute(SiteMojo.java:100)
at
org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:443)
at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:539)
at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:480)
at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:459)
at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:311)
at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:278)
at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:143)
at
org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:334)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:125)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:280)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
at
org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
{noformat}
The essence of the problem is as follows.
DependenciesRenderer has the following code to build POM out of all
dependencies, so that it can generate transitive dependency tree:
{noformat}
populateRepositoryMap( repoMap,
repoUtils.getRemoteArtifactRepositories() );
for ( Iterator it = alldeps.iterator(); it.hasNext(); )
{
Artifact artifact = (Artifact) it.next();
try
{
MavenProject artifactProject =
repoUtils.getMavenProjectFromRepository( artifact );
populateRepositoryMap( repoMap,
artifactProject.getRemoteArtifactRepositories() );
}
catch ( ProjectBuildingException e )
{
log.warn( "Unable to create Maven project from repository.", e
);
}
}
{noformat}
So when a project has a dependency to the system-scoped artifact,
repoUtils.getMavenProjectFromRepository( artifact ) invocation happens.
The implementation of this method is as follows:
{noformat}
public MavenProject getMavenProjectFromRepository( Artifact artifact )
throws ProjectBuildingException
{
Artifact projectArtifact = artifact;
boolean allowStubModel = false;
if ( !"pom".equals( artifact.getType() ) )
{
projectArtifact = factory.createProjectArtifact(
artifact.getGroupId(), artifact.getArtifactId(),
artifact.getVersion(), artifact.getScope() );
allowStubModel = true;
}
// TODO: we should use the MavenMetadataSource instead
return mavenProjectBuilder.buildFromRepository( projectArtifact,
remoteRepositories, localRepository,
allowStubModel );
}
{noformat}
You see that this calls "createProjectArtifact()". This is where the problem
happens --- that is, it ends up creating an Artifact object that has the system
scope, yet it won't have the file.
Eventually, MavenProjectBuilder tries to resolve this artifact, which gets to
DefaultArtifactResolver.resolve() as below:
{noformat}
private void resolve( Artifact artifact, List remoteRepositories,
ArtifactRepository localRepository,
boolean force )
throws ArtifactResolutionException, ArtifactNotFoundException
{
if ( artifact != null )
{
if ( Artifact.SCOPE_SYSTEM.equals( artifact.getScope() ) )
{
File systemFile = artifact.getFile();
if ( !systemFile.exists() )
{
throw new ArtifactNotFoundException(
"System artifact: " + artifact + " not found in path: "
+ systemFile, artifact );
}
{noformat}
And "systemFile.exists()" causes NPE.
I recommend fixing the getMavenProjectFromRepository method so that it throws
ProjectBuildingException immediately if a system-scoped artifact is given.
By the definition of the system scope, there's no POM. A very similar code
exists in DefaultMavenProjectBuilder.findModelFromRepository() that also needs
to be fixed.
Given that this problematic code is found in two places, I also recommend
changing DefaultArtifactResolver.resolve() method so that it handles this
situation gracefully
to avoid NPE.
--
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