diff --git a/maven-javadoc-plugin/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java b/maven-javadoc-plugin/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java
index 171736e..a2562a9 100644
--- a/maven-javadoc-plugin/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java
+++ b/maven-javadoc-plugin/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java
@@ -2620,43 +2620,40 @@
                 {
                     classpathElements.addAll( getProjectBuildOutputDirs( subProject ) );
 
-                    if ( session != null )
+                    try
                     {
-                        try
+                        StringBuilder sb = new StringBuilder();
+
+                        sb.append( "Compiled artifacts for " );
+                        sb.append( subProject.getGroupId() ).append( ":" );
+                        sb.append( subProject.getArtifactId() ).append( ":" );
+                        sb.append( subProject.getVersion() ).append( '\n' );
+
+                        ProjectBuildingRequest buildingRequest = session.getProjectBuildingRequest();
+                        buildingRequest =
+                            buildingRequest.setRemoteRepositories( subProject.getRemoteArtifactRepositories() );
+                        
+                        for ( ArtifactResult artifactResult
+                                    : dependencyResolver.resolveDependencies( buildingRequest,
+                                                                              subProject.getDependencies(),
+                                                                              null,
+                                                                              dependencyFilter ) )
                         {
-                            StringBuilder sb = new StringBuilder();
-
-                            sb.append( "Compiled artifacts for " );
-                            sb.append( subProject.getGroupId() ).append( ":" );
-                            sb.append( subProject.getArtifactId() ).append( ":" );
-                            sb.append( subProject.getVersion() ).append( '\n' );
-
-                            ProjectBuildingRequest buildingRequest = session.getProjectBuildingRequest();
-                            buildingRequest =
-                                buildingRequest.setRemoteRepositories( subProject.getRemoteArtifactRepositories() );
+                            populateCompileArtifactMap( compileArtifactMap,
+                                                        Collections.singletonList( artifactResult.getArtifact() ) );
                             
-                            for ( ArtifactResult artifactResult
-                                        : dependencyResolver.resolveDependencies( buildingRequest,
-                                                                                  subProject.getDependencies(),
-                                                                                  null,
-                                                                                  dependencyFilter ) )
-                            {
-                                populateCompileArtifactMap( compileArtifactMap,
-                                                            Collections.singletonList( artifactResult.getArtifact() ) );
-                                
-                                sb.append( artifactResult.getArtifact().getFile() ).append( '\n' );
-                            }
-                            
-                            if ( getLog().isDebugEnabled() )
-                            {
-                                getLog().debug( sb.toString() );
-                            }
-
+                            sb.append( artifactResult.getArtifact().getFile() ).append( '\n' );
                         }
-                        catch ( DependencyResolverException e )
+                        
+                        if ( getLog().isDebugEnabled() )
                         {
-                            throw new MavenReportException( e.getMessage(), e );
+                            getLog().debug( sb.toString() );
                         }
+
+                    }
+                    catch ( DependencyResolverException e )
+                    {
+                        throw new MavenReportException( e.getMessage(), e );
                     }
                 }
             }
diff --git a/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/AggregatorJavadocReportTest.java b/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/AggregatorJavadocReportTest.java
index e54bf63..bc94fcd 100644
--- a/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/AggregatorJavadocReportTest.java
+++ b/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/AggregatorJavadocReportTest.java
@@ -25,11 +25,14 @@
 import java.io.IOException;
 import java.util.List;
 
+import org.apache.maven.execution.MavenSession;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.plugin.testing.AbstractMojoTestCase;
-import org.apache.maven.plugins.javadoc.JavadocReport;
+import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
 import org.codehaus.plexus.util.FileUtils;
+import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager;
+import org.sonatype.aether.util.DefaultRepositorySystemSession;
 
 public class AggregatorJavadocReportTest
     extends AbstractMojoTestCase
@@ -63,8 +66,12 @@
         JavadocReport mojo = (JavadocReport) lookupMojo( "aggregate", testPom );
 
         MojoExecution mojoExec = new MojoExecution( new Plugin(), "aggregate", null );
-
         setVariableValueToObject( mojo, "mojo", mojoExec );
+        
+        MavenSession session = newMavenSession( new MavenProjectStub() );
+        DefaultRepositorySystemSession repoSysSession = (DefaultRepositorySystemSession) session.getRepositorySession();
+        repoSysSession.setLocalRepositoryManager( new SimpleLocalRepositoryManager( localRepo ) );
+        setVariableValueToObject( mojo, "session", session );
 
         return mojo;
     }
