[
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