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

        

Reply via email to