[ http://jira.codehaus.org/browse/MPIR-132?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Vincent Siveton updated MPIR-132: --------------------------------- Patch Submitted: (was: [Yes]) > 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