You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by mi...@apache.org on 2022/07/30 19:58:52 UTC

[maven-jxr] 01/01: Prepare for Doxia 2.0.0

This is an automated email from the ASF dual-hosted git repository.

michaelo pushed a commit to branch doxia-2.0.0
in repository https://gitbox.apache.org/repos/asf/maven-jxr.git

commit 3af21071958ef2a3cd43f4e4d9c7e38bc9a4355e
Author: Michael Osipov <mi...@apache.org>
AuthorDate: Sat Jul 30 21:58:41 2022 +0200

    Prepare for Doxia 2.0.0
---
 maven-jxr-plugin/pom.xml                           |  34 +++--
 .../apache/maven/plugin/jxr/AbstractJxrReport.java |  97 ++-----------
 .../maven/plugin/jxr/AbstractJxrTestCase.java      | 159 +++++++++++++++++++++
 .../plugin/jxr/DependencyArtifactStubFactory.java  |  69 +++++++++
 .../org/apache/maven/plugin/jxr/JxrReportTest.java |  67 ++-------
 .../apache/maven/plugin/jxr/JxrTestReportTest.java |  16 +--
 .../ExcludeConfigurationMavenProjectStub.java      |   4 +-
 .../IncludeConfigurationMavenProjectStub.java      |   4 +-
 .../maven/plugin/jxr/stubs/JxrProjectStub.java     |  23 +++
 .../jxr/stubs/NoJavadocDirMavenProjectStub.java    |   2 +-
 .../jxr/stubs/TestSourceDirMavenProjectStub.java   |   6 +-
 .../aggregate-test-plugin-config.xml               |   3 +-
 .../default-configuration-plugin-config-4.xml      |   1 +
 .../default-configuration-plugin-config-6.xml      |   1 +
 .../default-configuration-plugin-config-7.xml      |   1 +
 .../default-configuration-plugin-config-8.xml      |   1 +
 .../default-configuration-plugin-config.xml        |   1 +
 .../exception-test-plugin-config.xml               |   1 +
 .../exclude-configuration-plugin-config.xml        |   1 +
 .../include-configuration-plugin-config.xml        |   1 +
 .../nojavadocdir-test-plugin-config.xml            |   1 +
 .../nojavadoclink-configuration-plugin-config.xml  |   1 +
 .../unit/pom-test/pom-test-plugin-config.xml       |   1 +
 .../testsourcedir-test-plugin-config.xml           |   1 +
 pom.xml                                            |   2 +-
 25 files changed, 326 insertions(+), 172 deletions(-)

diff --git a/maven-jxr-plugin/pom.xml b/maven-jxr-plugin/pom.xml
index 7feeb89..0a219e3 100644
--- a/maven-jxr-plugin/pom.xml
+++ b/maven-jxr-plugin/pom.xml
@@ -37,6 +37,7 @@ under the License.
 
   <properties>
     <mavenVersion>3.2.5</mavenVersion>
+    <aetherVersion>1.0.0.v20140518</aetherVersion>
   </properties>
 
   <prerequisites>
@@ -88,13 +89,7 @@ under the License.
     <dependency>
       <groupId>org.apache.maven.reporting</groupId>
       <artifactId>maven-reporting-impl</artifactId>
-      <version>3.1.0</version>
-      <exclusions>
-        <exclusion>
-          <groupId>org.codehaus.plexus</groupId>
-          <artifactId>plexus-container-default</artifactId>
-        </exclusion>
-      </exclusions>
+      <version>4.0.0-M2</version>
     </dependency>
 
     <!-- shared utils -->
@@ -126,6 +121,30 @@ under the License.
         </exclusion>
       </exclusions>
     </dependency>
+    <dependency>
+      <groupId>org.eclipse.aether</groupId>
+      <artifactId>aether-impl</artifactId>
+      <version>${aetherVersion}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.aether</groupId>
+      <artifactId>aether-connector-basic</artifactId>
+      <version>${aetherVersion}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.aether</groupId>
+      <artifactId>aether-transport-wagon</artifactId>
+      <version>${aetherVersion}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.wagon</groupId>
+      <artifactId>wagon-http-lightweight</artifactId>
+      <version>3.5.1</version>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
@@ -188,7 +207,6 @@ under the License.
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-invoker-plugin</artifactId>
             <configuration>
-              <projectsDirectory>src/it</projectsDirectory>
               <cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
               <pomIncludes>
                 <pomInclude>*/pom.xml</pomInclude>
diff --git a/maven-jxr-plugin/src/main/java/org/apache/maven/plugin/jxr/AbstractJxrReport.java b/maven-jxr-plugin/src/main/java/org/apache/maven/plugin/jxr/AbstractJxrReport.java
index 10f9467..dc7059d 100644
--- a/maven-jxr-plugin/src/main/java/org/apache/maven/plugin/jxr/AbstractJxrReport.java
+++ b/maven-jxr-plugin/src/main/java/org/apache/maven/plugin/jxr/AbstractJxrReport.java
@@ -31,22 +31,19 @@ import java.util.List;
 import java.util.Locale;
 import java.util.ResourceBundle;
 
-import org.apache.maven.doxia.siterenderer.Renderer;
+import org.apache.maven.execution.MavenSession;
 import org.apache.maven.jxr.JXR;
 import org.apache.maven.jxr.JavaCodeTransform;
 import org.apache.maven.jxr.JxrException;
 import org.apache.maven.jxr.pacman.FileManager;
 import org.apache.maven.jxr.pacman.PackageManager;
 import org.apache.maven.model.ReportPlugin;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.reporting.AbstractMavenReport;
 import org.apache.maven.reporting.MavenReportException;
 import org.codehaus.plexus.languages.java.version.JavaVersion;
 import org.codehaus.plexus.util.FileUtils;
-import org.codehaus.plexus.util.ReaderFactory;
 import org.codehaus.plexus.util.StringUtils;
 
 /**
@@ -60,31 +57,9 @@ import org.codehaus.plexus.util.StringUtils;
 public abstract class AbstractJxrReport
     extends AbstractMavenReport
 {
-    @Parameter( defaultValue = "${project}", readonly = true, required = true )
-    private MavenProject project;
 
-    @Component
-    private Renderer siteRenderer;
-
-    /**
-     * Output folder where the main page of the report will be generated. Note that this parameter is only relevant if
-     * the goal is run directly from the command line or from the default lifecycle. If the goal is run indirectly as
-     * part of a site generation, the output directory configured in the Maven Site Plugin will be used instead.
-     */
-    @Parameter( defaultValue = "${project.reporting.outputDirectory}", required = true )
-    private File outputDirectory;
-
-    /**
-     * File input encoding.
-     */
-    @Parameter( property = "encoding", defaultValue = "${project.build.sourceEncoding}" )
-    private String inputEncoding;
-
-    /**
-     * File output encoding.
-     */
-    @Parameter( property = "outputEncoding", defaultValue = "${project.reporting.outputEncoding}" )
-    private String outputEncoding;
+    @Parameter( defaultValue = "${session}", readonly = true, required = true )
+    private MavenSession session;
 
     /**
      * Title of window of the Xref HTML files.
@@ -171,18 +146,6 @@ public abstract class AbstractJxrReport
      */
     private JavaVersion javadocTemplatesVersion;
 
-    /**
-     * Gets the effective reporting output files encoding.
-     *
-     * @return The effective reporting output file encoding, never <code>null</code>: defaults to <code>UTF-8</code>
-     *         instead.
-     */
-    @Override
-    protected String getOutputEncoding()
-    {
-        return ( outputEncoding == null ) ? ReaderFactory.UTF_8 : outputEncoding;
-    }
-
     /**
      * Compiles the list of directories which contain source files that will be included in the JXR report generation.
      *
@@ -270,16 +233,10 @@ public abstract class AbstractJxrReport
         FileManager fileManager = new FileManager();
         PackageManager packageManager = new PackageManager( fileManager );
         JavaCodeTransform codeTransform = new JavaCodeTransform( packageManager, fileManager );
-        
+
         JXR jxr = new JXR( packageManager, codeTransform );
         jxr.setDest( Paths.get( destinationDirectory ) );
-        if ( StringUtils.isEmpty( inputEncoding ) )
-        {
-            String platformEncoding = System.getProperty( "file.encoding" );
-            getLog().warn( "File encoding has not been set, using platform encoding " + platformEncoding
-                               + ", i.e. build is platform dependent!" );
-        }
-        jxr.setInputEncoding( inputEncoding );
+        jxr.setInputEncoding( getInputEncoding() );
         jxr.setLocale( locale );
         jxr.setOutputEncoding( getOutputEncoding() );
         jxr.setRevision( "HEAD" );
@@ -457,21 +414,14 @@ public abstract class AbstractJxrReport
     }
 
     @Override
-    protected Renderer getSiteRenderer()
-    {
-        return siteRenderer;
-    }
-
-    @Override
-    protected String getOutputDirectory()
+    protected MavenProject getProject()
     {
-        return outputDirectory.getAbsolutePath();
+        return project;
     }
 
-    @Override
-    public MavenProject getProject()
+    protected MavenSession getSession()
     {
-        return project;
+        return session;
     }
 
     /**
@@ -500,37 +450,12 @@ public abstract class AbstractJxrReport
         return canGenerate;
     }
 
-    /*
-     * This is called for a standalone execution. Well, that's the claim. It also ends up called for the aggregate mojo,
-     * since that is configured as an execution, not in the reporting section, at least by some people on some days. We
-     * do NOT want the default behavior.
-     */
-    @Override
-    public void execute()
-        throws MojoExecutionException
-    {
-
-        if ( skip )
-        {
-            getLog().info( "Skipping JXR." );
-            return;
-        }
-
-        Locale locale = Locale.getDefault();
-        try
-        {
-            executeReport( locale );
-        }
-        catch ( MavenReportException e )
-        {
-            throw new MojoExecutionException( "Error generating JXR report", e );
-        }
-    }
-
     @Override
     protected void executeReport( Locale locale )
         throws MavenReportException
     {
+        System.out.println( localRepository );
+
         if ( skip )
         {
             getLog().info( "Skipping JXR." );
diff --git a/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/AbstractJxrTestCase.java b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/AbstractJxrTestCase.java
new file mode 100644
index 0000000..119fb02
--- /dev/null
+++ b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/AbstractJxrTestCase.java
@@ -0,0 +1,159 @@
+package org.apache.maven.plugin.jxr;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+
+import org.apache.maven.plugin.LegacySupport;
+import org.apache.maven.plugin.testing.AbstractMojoTestCase;
+import org.apache.maven.plugin.testing.ArtifactStubFactory;
+import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
+import org.apache.maven.project.DefaultProjectBuildingRequest;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.ProjectBuilder;
+import org.apache.maven.project.ProjectBuildingRequest;
+import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
+import org.eclipse.aether.DefaultRepositorySystemSession;
+import org.eclipse.aether.repository.LocalRepository;
+
+/**
+ * Abstract class to test reports generation.
+ */
+public abstract class AbstractJxrTestCase
+    extends AbstractMojoTestCase
+{
+    private ArtifactStubFactory artifactStubFactory;
+
+    /**
+     * The current project to be test.
+     */
+    private MavenProject testMavenProject;
+
+    @Override
+    protected void setUp()
+        throws Exception
+    {
+        // required for mojo lookups to work
+        super.setUp();
+
+        artifactStubFactory = new DependencyArtifactStubFactory( getTestFile( "target" ), true, false );
+        artifactStubFactory.getWorkingDir().mkdirs();
+    }
+
+    @Override
+    protected void tearDown()
+        throws Exception
+    {
+        super.tearDown();
+    }
+
+    /**
+     * Get the current Maven project
+     *
+     * @return the maven project
+     */
+    protected MavenProject getTestMavenProject()
+    {
+        return testMavenProject;
+    }
+
+    /**
+     * Get the generated report as file in the test maven project.
+     *
+     * @param name the name of the report.
+     * @return the generated report as file
+     * @throws IOException if the return file doesnt exist
+     */
+    protected File getGeneratedReport( String name )
+        throws IOException
+    {
+        String outputDirectory = getBasedir() + "/target/test/unit/" + getTestMavenProject().getArtifactId();
+
+        File report = new File( outputDirectory, name );
+        if ( !report.exists() )
+        {
+            throw new IOException( "File not found. Attempted: " + report );
+        }
+
+        return report;
+    }
+
+    /**
+     * Generate the report and return the generated file
+     *
+     * @param goal the mojo goal.
+     * @param pluginXml the name of the xml file in "src/test/resources/plugin-configs/".
+     * @return the generated HTML file
+     * @throws Exception if any
+     */
+    protected File generateReport( String goal, String pluginXml )
+        throws Exception
+    {
+        File pluginXmlFile = new File( getBasedir(), "src/test/resources/unit/" + pluginXml );
+        AbstractJxrReport mojo  = createReportMojo( goal, pluginXmlFile );
+        return generateReport( mojo, pluginXmlFile );
+    }
+
+    protected AbstractJxrReport createReportMojo( String goal, File pluginXmlFile )
+        throws Exception
+    {
+        AbstractJxrReport mojo = (AbstractJxrReport) lookupMojo( goal, pluginXmlFile );
+        assertNotNull( "Mojo not found.", mojo );
+
+        LegacySupport legacySupport = lookup( LegacySupport.class );
+        legacySupport.setSession( newMavenSession( new MavenProjectStub() ) );
+        DefaultRepositorySystemSession repoSession =
+            (DefaultRepositorySystemSession) legacySupport.getRepositorySession();
+        repoSession.setLocalRepositoryManager( new SimpleLocalRepositoryManagerFactory().newInstance( repoSession, new LocalRepository( artifactStubFactory.getWorkingDir() ) ) );
+
+        setVariableValueToObject( mojo, "session", legacySupport.getSession() );
+        setVariableValueToObject( mojo, "remoteRepositories", mojo.getProject().getRemoteArtifactRepositories() );
+        return mojo;
+    }
+
+    protected File generateReport( AbstractJxrReport mojo, File pluginXmlFile )
+        throws Exception
+    {
+        mojo.execute();
+
+        ProjectBuilder builder = lookup( ProjectBuilder.class );
+
+        ProjectBuildingRequest buildingRequest = new DefaultProjectBuildingRequest();
+        buildingRequest.setRepositorySession( lookup( LegacySupport.class ).getRepositorySession() );
+
+        testMavenProject = builder.build( pluginXmlFile, buildingRequest ).getProject();
+
+        File outputDir = mojo.getReportOutputDirectory();
+        String filename = mojo.getOutputName() + ".html";
+
+        return new File( outputDir, filename );
+    }
+
+    /**
+     * Read the contents of the specified file object into a string
+     */
+    protected String readFile( File xrefTestDir, String fileName ) throws IOException
+    {
+        return new String( Files.readAllBytes( xrefTestDir.toPath().resolve( fileName ) ) );
+    }
+
+}
diff --git a/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/DependencyArtifactStubFactory.java b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/DependencyArtifactStubFactory.java
new file mode 100644
index 0000000..849d214
--- /dev/null
+++ b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/DependencyArtifactStubFactory.java
@@ -0,0 +1,69 @@
+package org.apache.maven.plugin.jxr;
+
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.ArtifactUtils;
+import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.plugin.testing.ArtifactStubFactory;
+
+public class DependencyArtifactStubFactory
+    extends ArtifactStubFactory
+{
+    private boolean flattenedPath = true;
+
+    public DependencyArtifactStubFactory( File theWorkingDir, boolean theCreateFiles, boolean flattenedPath )
+    {
+        this( theWorkingDir, theCreateFiles );
+        this.flattenedPath = flattenedPath;
+    }
+
+    public DependencyArtifactStubFactory( File theWorkingDir, boolean theCreateFiles )
+    {
+        super( theWorkingDir, theCreateFiles );
+    }
+
+    @Override
+    public Artifact createArtifact( String groupId, String artifactId, VersionRange versionRange, String scope,
+                                    String type, String classifier, boolean optional )
+        throws IOException
+    {
+        File workingDir = getWorkingDir();
+
+        if ( !flattenedPath )
+        {
+            // don't use flatten directories, won't happen at runtime
+            String path = groupId.replace( '.', '/' ) + '/' +
+                    artifactId + '/' +
+                    ArtifactUtils.toSnapshotVersion( versionRange.getRecommendedVersion().toString() );
+            setWorkingDir( new File( workingDir, path ) );
+        }
+
+        Artifact artifact =
+            super.createArtifact( groupId, artifactId, versionRange, scope, type, classifier, optional );
+
+        setWorkingDir( workingDir );
+
+        return artifact;
+    }
+}
diff --git a/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/JxrReportTest.java b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/JxrReportTest.java
index 023938b..90b0a74 100644
--- a/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/JxrReportTest.java
+++ b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/JxrReportTest.java
@@ -19,11 +19,9 @@ package org.apache.maven.plugin.jxr;
  * under the License.
  */
 
-import org.apache.maven.plugin.testing.AbstractMojoTestCase;
 import org.codehaus.plexus.util.FileUtils;
 
 import java.io.File;
-import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Locale;
@@ -33,7 +31,7 @@ import java.util.Locale;
  * @author <a href="mailto:dennisl@apache.org">Dennis Lundberg</a>
  */
 public class JxrReportTest
-    extends AbstractMojoTestCase
+    extends AbstractJxrTestCase
 {
     /**
      * Test the plugin with original configuration
@@ -50,9 +48,7 @@ public class JxrReportTest
 
         FileUtils.copyDirectory( new File( resourcesDir, "javadoc-files" ), outputDir );
 
-        File testPom = new File( resourcesDir, "default-configuration-plugin-config.xml" );
-        JxrReport mojo = (JxrReport) lookupMojo( "jxr", testPom );
-        mojo.execute();
+        generateReport( "jxr", "default-configuration/default-configuration-plugin-config.xml" );
 
         //check if xref files were generated
         assertTrue( new File( xrefDir, "allclasses-frame.html" ).exists() );
@@ -91,9 +87,7 @@ public class JxrReportTest
 
         FileUtils.copyDirectory( new File( resourcesDir, "javadoc-files" ), outputDir );
 
-        File testPom = new File( resourcesDir, "default-configuration-plugin-config-4.xml" );
-        JxrReport mojo = (JxrReport) lookupMojo( "jxr", testPom );
-        mojo.execute();
+        generateReport( "jxr", "default-configuration/default-configuration-plugin-config-4.xml" );
 
         //check if xref files were generated
         assertTrue( new File( xrefDir, "allclasses-frame.html" ).exists() );
@@ -132,9 +126,7 @@ public class JxrReportTest
 
         FileUtils.copyDirectory( new File( resourcesDir, "javadoc-files" ), outputDir );
 
-        File testPom = new File( resourcesDir, "default-configuration-plugin-config-6.xml" );
-        JxrReport mojo = (JxrReport) lookupMojo( "jxr", testPom );
-        mojo.execute();
+        generateReport( "jxr", "default-configuration/default-configuration-plugin-config-6.xml" );
 
         //check if xref files were generated
         assertTrue( new File( xrefDir, "allclasses-frame.html" ).exists() );
@@ -173,9 +165,7 @@ public class JxrReportTest
 
         FileUtils.copyDirectory( new File( resourcesDir, "javadoc-files" ), outputDir );
 
-        File testPom = new File( resourcesDir, "default-configuration-plugin-config-7.xml" );
-        JxrReport mojo = (JxrReport) lookupMojo( "jxr", testPom );
-        mojo.execute();
+        generateReport( "jxr", "default-configuration/default-configuration-plugin-config-7.xml" );
 
         //check if xref files were generated
         assertTrue( new File( xrefDir, "allclasses-frame.html" ).exists() );
@@ -218,9 +208,7 @@ public class JxrReportTest
 
         FileUtils.copyDirectory( new File( resourcesDir, "javadoc-files" ), outputDir );
 
-        File testPom = new File( resourcesDir, "default-configuration-plugin-config-8.xml" );
-        JxrReport mojo = (JxrReport) lookupMojo( "jxr", testPom );
-        mojo.execute();
+        generateReport( "jxr", "default-configuration/default-configuration-plugin-config-8.xml" );
 
         //check if xref files were generated
         assertTrue( new File( xrefDir, "allclasses-frame.html" ).exists() );
@@ -252,10 +240,7 @@ public class JxrReportTest
     public void testNoJavadocLink()
         throws Exception
     {
-        File testPom = new File( getBasedir(),
-                "src/test/resources/unit/nojavadoclink-configuration/nojavadoclink-configuration-plugin-config.xml" );
-        JxrReport mojo = (JxrReport) lookupMojo( "jxr", testPom );
-        mojo.execute();
+        generateReport( "jxr", "nojavadoclink-configuration/nojavadoclink-configuration-plugin-config.xml" );
 
         File xrefDir = new File( getBasedir(), "target/test/unit/nojavadoclink-configuration/target/site/xref" );
 
@@ -296,10 +281,7 @@ public class JxrReportTest
     public void testAggregate()
         throws Exception
     {
-        File testPom = new File( getBasedir(),
-                "src/test/resources/unit/aggregate-test/aggregate-test-plugin-config.xml" );
-        JxrReport mojo = (JxrReport) lookupMojo( "jxr", testPom );
-        mojo.execute();
+        generateReport( "jxr", "aggregate-test/aggregate-test-plugin-config.xml" );
 
         File xrefDir = new File( getBasedir(), "target/test/unit/aggregate-test/target/site/xref" );
 
@@ -314,7 +296,6 @@ public class JxrReportTest
         assertTrue( new File( xrefDir, "aggregate/test/submodule2/package-summary.html" ).exists() );
         assertTrue( new File( xrefDir, "aggregate/test/submodule2/Submodule2App.html" ).exists() );
         assertTrue( new File( xrefDir, "aggregate/test/submodule2/Submodule2AppSample.html" ).exists() );
-
     }
 
     /**
@@ -325,10 +306,7 @@ public class JxrReportTest
     public void testNoJavadocDir()
         throws Exception
     {
-        File testPom = new File( getBasedir(),
-                "src/test/resources/unit/nojavadocdir-test/nojavadocdir-test-plugin-config.xml" );
-        JxrReport mojo = (JxrReport) lookupMojo( "jxr", testPom );
-        mojo.execute();
+        generateReport( "jxr", "nojavadocdir-test/nojavadocdir-test-plugin-config.xml" );
 
         File xrefDir = new File( getBasedir(), "target/test/unit/nojavadocdir-test/target/site/xref" );
 
@@ -338,7 +316,6 @@ public class JxrReportTest
 
         str = readFile( xrefDir, "nojavadocdir/test/App.html" );
         assertTrue( str.toLowerCase( Locale.US ).contains( "/apidocs/nojavadocdir/test/app.html" ) );
-
     }
 
     /**
@@ -349,10 +326,7 @@ public class JxrReportTest
     public void testExclude()
         throws Exception
     {
-        File testPom = new File( getBasedir(),
-                "src/test/resources/unit/exclude-configuration/exclude-configuration-plugin-config.xml" );
-        JxrReport mojo = (JxrReport) lookupMojo( "jxr", testPom );
-        mojo.execute();
+        generateReport( "jxr", "exclude-configuration/exclude-configuration-plugin-config.xml" );
 
         Path xrefDir = new File( getBasedir(), "target/test/unit/exclude-configuration/target/site/xref" ).toPath();
 
@@ -371,10 +345,7 @@ public class JxrReportTest
     public void testInclude()
         throws Exception
     {
-        File testPom = new File( getBasedir(),
-                "src/test/resources/unit/include-configuration/include-configuration-plugin-config.xml" );
-        JxrReport mojo = (JxrReport) lookupMojo( "jxr", testPom );
-        mojo.execute();
+        generateReport( "jxr", "include-configuration/include-configuration-plugin-config.xml" );
 
         Path xrefDir = new File( getBasedir(), "target/test/unit/include-configuration/target/site/xref" ).toPath();
 
@@ -389,10 +360,7 @@ public class JxrReportTest
     {
         try
         {
-            File testPom = new File( getBasedir(),
-                    "src/test/resources/unit/default-configuration/exception-test-plugin-config.xml" );
-            JxrReport mojo = (JxrReport) lookupMojo( "jxr", testPom );
-            mojo.execute();
+            generateReport( "jxr", "default-configuration/exception-test-plugin-config.xml" );
 
             fail( "Must throw exception" );
         }
@@ -410,18 +378,9 @@ public class JxrReportTest
     public void testPom()
         throws Exception
     {
-        File testPom = new File( getBasedir(), "src/test/resources/unit/pom-test/pom-test-plugin-config.xml" );
-        JxrReport mojo = (JxrReport) lookupMojo( "jxr", testPom );
-        mojo.execute();
+        generateReport( "jxr", "pom-test/pom-test-plugin-config.xml" );
 
         assertFalse( new File( getBasedir(), "target/test/unit/pom-test" ).exists() );
     }
 
-    /**
-     * Read the contents of the specified file object into a string
-     */
-    private String readFile( File xrefTestDir, String fileName ) throws IOException
-    {
-        return new String( Files.readAllBytes( xrefTestDir.toPath().resolve( fileName ) ) );
-    }
 }
diff --git a/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/JxrTestReportTest.java b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/JxrTestReportTest.java
index 98bd456..c70eab2 100644
--- a/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/JxrTestReportTest.java
+++ b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/JxrTestReportTest.java
@@ -23,13 +23,11 @@ import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 
-import org.apache.maven.plugin.testing.AbstractMojoTestCase;
-
 /**
  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
  */
 public class JxrTestReportTest
-    extends AbstractMojoTestCase
+    extends AbstractJxrTestCase
 {
     /**
      * Method to test when the source dir is the test source dir
@@ -39,10 +37,7 @@ public class JxrTestReportTest
     public void testSourceDir()
         throws Exception
     {
-        File testPom =
-            new File( getBasedir(), "src/test/resources/unit/testsourcedir-test/testsourcedir-test-plugin-config.xml" );
-        JxrTestReport mojo = (JxrTestReport) lookupMojo( "test-jxr", testPom );
-        mojo.execute();
+        generateReport( "test-jxr", "testsourcedir-test/testsourcedir-test-plugin-config.xml" );
 
         File xrefTestDir = new File( getBasedir(), "target/test/unit/testsourcedir-test/target/site/xref-test" );
 
@@ -65,11 +60,4 @@ public class JxrTestReportTest
         assertFalse( str.toLowerCase().contains( "/apidocs/testsourcedir/test/App.html\"".toLowerCase() ) );
     }
 
-    /**
-     * Read the contents of the specified file object into a string
-     */
-    private String readFile( File xrefTestDir, String fileName ) throws IOException
-    {
-        return new String( Files.readAllBytes( xrefTestDir.toPath().resolve( fileName ) ) );
-    }
 }
diff --git a/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/ExcludeConfigurationMavenProjectStub.java b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/ExcludeConfigurationMavenProjectStub.java
index 0eec0e3..24c0fa0 100644
--- a/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/ExcludeConfigurationMavenProjectStub.java
+++ b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/ExcludeConfigurationMavenProjectStub.java
@@ -23,7 +23,6 @@ import org.apache.maven.artifact.Artifact;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.ReportPlugin;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
-import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
 
 import java.io.FileReader;
 import java.util.ArrayList;
@@ -32,7 +31,8 @@ import java.util.List;
 /**
  * @author <a href="mailto:dennisl@apache.org">Dennis Lundberg</a>
  */
-public class ExcludeConfigurationMavenProjectStub extends MavenProjectStub
+public class ExcludeConfigurationMavenProjectStub
+    extends JxrProjectStub
 {
     private List<ReportPlugin> reportPlugins = new ArrayList<>();
 
diff --git a/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/IncludeConfigurationMavenProjectStub.java b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/IncludeConfigurationMavenProjectStub.java
index 3b35488..10a1623 100644
--- a/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/IncludeConfigurationMavenProjectStub.java
+++ b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/IncludeConfigurationMavenProjectStub.java
@@ -23,7 +23,6 @@ import org.apache.maven.artifact.Artifact;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.ReportPlugin;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
-import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
 
 import java.io.FileReader;
 import java.util.ArrayList;
@@ -32,7 +31,8 @@ import java.util.List;
 /**
  * @author <a href="mailto:dennisl@apache.org">Dennis Lundberg</a>
  */
-public class IncludeConfigurationMavenProjectStub extends MavenProjectStub
+public class IncludeConfigurationMavenProjectStub
+    extends JxrProjectStub
 {
     private List<ReportPlugin> reportPlugins = new ArrayList<>();
 
diff --git a/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/JxrProjectStub.java b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/JxrProjectStub.java
new file mode 100644
index 0000000..b2cf1e9
--- /dev/null
+++ b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/JxrProjectStub.java
@@ -0,0 +1,23 @@
+package org.apache.maven.plugin.jxr.stubs;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
+import org.apache.maven.artifact.repository.MavenArtifactRepository;
+import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
+import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
+
+public abstract class JxrProjectStub
+    extends MavenProjectStub
+{
+    @Override
+    public List<ArtifactRepository> getRemoteArtifactRepositories()
+    {
+        ArtifactRepository repository = new MavenArtifactRepository( "central", "https://repo1.maven.org/maven2",
+                                                                       new DefaultRepositoryLayout(), new ArtifactRepositoryPolicy(), new ArtifactRepositoryPolicy() );
+
+        return Collections.singletonList( repository );
+    }
+}
diff --git a/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/NoJavadocDirMavenProjectStub.java b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/NoJavadocDirMavenProjectStub.java
index c4c56e6..0448f95 100644
--- a/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/NoJavadocDirMavenProjectStub.java
+++ b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/NoJavadocDirMavenProjectStub.java
@@ -33,7 +33,7 @@ import java.util.List;
  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
  */
 public class NoJavadocDirMavenProjectStub
-    extends MavenProjectStub
+    extends JxrProjectStub
 {
     private List<ReportPlugin> reportPlugins;
 
diff --git a/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/TestSourceDirMavenProjectStub.java b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/TestSourceDirMavenProjectStub.java
index 69ca4e6..b441285 100644
--- a/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/TestSourceDirMavenProjectStub.java
+++ b/maven-jxr-plugin/src/test/java/org/apache/maven/plugin/jxr/stubs/TestSourceDirMavenProjectStub.java
@@ -22,7 +22,6 @@ package org.apache.maven.plugin.jxr.stubs;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
-import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
 
 import java.io.FileReader;
 import java.util.ArrayList;
@@ -32,9 +31,9 @@ import java.util.List;
  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
  */
 public class TestSourceDirMavenProjectStub
-    extends MavenProjectStub
+    extends JxrProjectStub
 {
-    
+
     public TestSourceDirMavenProjectStub()
     {
         MavenXpp3Reader pomReader = new MavenXpp3Reader();
@@ -67,4 +66,5 @@ public class TestSourceDirMavenProjectStub
         setArtifact( artifact );
 
     }
+
 }
diff --git a/maven-jxr-plugin/src/test/resources/unit/aggregate-test/aggregate-test-plugin-config.xml b/maven-jxr-plugin/src/test/resources/unit/aggregate-test/aggregate-test-plugin-config.xml
index 6236fc9..27bac58 100644
--- a/maven-jxr-plugin/src/test/resources/unit/aggregate-test/aggregate-test-plugin-config.xml
+++ b/maven-jxr-plugin/src/test/resources/unit/aggregate-test/aggregate-test-plugin-config.xml
@@ -37,7 +37,7 @@ under the License.
           <docTitle>Maven Jxr Plugin Aggregate Test 1.0-SNAPSHOT Reference</docTitle>
           <inputEncoding>ISO-8859-1</inputEncoding>
           <outputEncoding>ISO-8859-1</outputEncoding>
-          <sourceDirs>            
+          <sourceDirs>
             <value>${basedir}/src/test/resources/unit/aggregate-test/submodule1</value>
             <value>${basedir}/src/test/resources/unit/aggregate-test/submodule2</value>
           </sourceDirs>
@@ -51,6 +51,7 @@ under the License.
             <project implementation="org.apache.maven.plugin.jxr.stubs.AggregateSubmodule1MavenProjectStub"/>
             <project implementation="org.apache.maven.plugin.jxr.stubs.AggregateSubmodule2MavenProjectStub"/>
           </reactorProjects>
+          <localRepository>${localRepository}</localRepository>
         </configuration>
       </plugin>
     </plugins>
diff --git a/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config-4.xml b/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config-4.xml
index 124f7aa..bf302a1 100644
--- a/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config-4.xml
+++ b/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config-4.xml
@@ -44,6 +44,7 @@ under the License.
           <linkJavadoc>true</linkJavadoc>
           <bottom>Copyright 2006 Apache Foundation</bottom>
           <javadocVersion>1.4</javadocVersion>
+          <localRepository>${localRepository}</localRepository>
         </configuration>
       </plugin>
     </plugins>
diff --git a/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config-6.xml b/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config-6.xml
index 5f0edb2..eac7aee 100644
--- a/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config-6.xml
+++ b/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config-6.xml
@@ -44,6 +44,7 @@ under the License.
           <linkJavadoc>true</linkJavadoc>
           <bottom>Copyright 2006 Apache Foundation</bottom>
           <javadocVersion>1.6</javadocVersion>
+          <localRepository>${localRepository}</localRepository>
         </configuration>
       </plugin>
     </plugins>
diff --git a/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config-7.xml b/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config-7.xml
index db16d9d..dbe4d6d 100644
--- a/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config-7.xml
+++ b/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config-7.xml
@@ -44,6 +44,7 @@ under the License.
           <linkJavadoc>true</linkJavadoc>
           <bottom>Copyright 2006 Apache Foundation</bottom>
           <javadocVersion>1.7</javadocVersion>
+          <localRepository>${localRepository}</localRepository>
         </configuration>
       </plugin>
     </plugins>
diff --git a/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config-8.xml b/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config-8.xml
index 8be96ac..9e33092 100644
--- a/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config-8.xml
+++ b/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config-8.xml
@@ -44,6 +44,7 @@ under the License.
           <linkJavadoc>true</linkJavadoc>
           <bottom>Copyright 2006 Apache Foundation</bottom>
           <javadocVersion>1.8</javadocVersion>
+          <localRepository>${localRepository}</localRepository>
         </configuration>
       </plugin>
     </plugins>
diff --git a/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config.xml b/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config.xml
index 6841a75..1f4769d 100644
--- a/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config.xml
+++ b/maven-jxr-plugin/src/test/resources/unit/default-configuration/default-configuration-plugin-config.xml
@@ -46,6 +46,7 @@ under the License.
           <templateDir>templates</templateDir>
           <stylesheet>stylesheet.css</stylesheet>
           <javadocVersion>3</javadocVersion>
+          <localRepository>${localRepository}</localRepository>
         </configuration>
       </plugin>
     </plugins>
diff --git a/maven-jxr-plugin/src/test/resources/unit/default-configuration/exception-test-plugin-config.xml b/maven-jxr-plugin/src/test/resources/unit/default-configuration/exception-test-plugin-config.xml
index 1ac1e93..cd37da4 100644
--- a/maven-jxr-plugin/src/test/resources/unit/default-configuration/exception-test-plugin-config.xml
+++ b/maven-jxr-plugin/src/test/resources/unit/default-configuration/exception-test-plugin-config.xml
@@ -46,6 +46,7 @@ under the License.
           <bottom>Copyright 2006 Apache Foundation</bottom>
           <templateDir>temp</templateDir>
           <stylesheet>stylesheet.css</stylesheet>
+          <localRepository>${localRepository}</localRepository>
         </configuration>
       </plugin>
     </plugins>
diff --git a/maven-jxr-plugin/src/test/resources/unit/exclude-configuration/exclude-configuration-plugin-config.xml b/maven-jxr-plugin/src/test/resources/unit/exclude-configuration/exclude-configuration-plugin-config.xml
index cc61d9f..d136487 100644
--- a/maven-jxr-plugin/src/test/resources/unit/exclude-configuration/exclude-configuration-plugin-config.xml
+++ b/maven-jxr-plugin/src/test/resources/unit/exclude-configuration/exclude-configuration-plugin-config.xml
@@ -49,6 +49,7 @@ under the License.
           <excludes>
             <exclude>**/AppSample.java</exclude>
           </excludes>
+          <localRepository>${localRepository}</localRepository>
         </configuration>
       </plugin>
     </plugins>
diff --git a/maven-jxr-plugin/src/test/resources/unit/include-configuration/include-configuration-plugin-config.xml b/maven-jxr-plugin/src/test/resources/unit/include-configuration/include-configuration-plugin-config.xml
index 580c19c..d0cfaed 100644
--- a/maven-jxr-plugin/src/test/resources/unit/include-configuration/include-configuration-plugin-config.xml
+++ b/maven-jxr-plugin/src/test/resources/unit/include-configuration/include-configuration-plugin-config.xml
@@ -49,6 +49,7 @@ under the License.
           <includes>
             <include>**/App.java</include>
           </includes>
+          <localRepository>${localRepository}</localRepository>
         </configuration>
       </plugin>
     </plugins>
diff --git a/maven-jxr-plugin/src/test/resources/unit/nojavadocdir-test/nojavadocdir-test-plugin-config.xml b/maven-jxr-plugin/src/test/resources/unit/nojavadocdir-test/nojavadocdir-test-plugin-config.xml
index 351f7aa..0c3a0b2 100644
--- a/maven-jxr-plugin/src/test/resources/unit/nojavadocdir-test/nojavadocdir-test-plugin-config.xml
+++ b/maven-jxr-plugin/src/test/resources/unit/nojavadocdir-test/nojavadocdir-test-plugin-config.xml
@@ -46,6 +46,7 @@ under the License.
           <bottom>Copyright 2006 Apache Foundation</bottom>
           <javadocVersion>1.4</javadocVersion>
           <stylesheet>stylesheet.css</stylesheet>
+          <localRepository>${localRepository}</localRepository>
         </configuration>
       </plugin>
     </plugins>
diff --git a/maven-jxr-plugin/src/test/resources/unit/nojavadoclink-configuration/nojavadoclink-configuration-plugin-config.xml b/maven-jxr-plugin/src/test/resources/unit/nojavadoclink-configuration/nojavadoclink-configuration-plugin-config.xml
index 6fae9b8..ba569bc 100644
--- a/maven-jxr-plugin/src/test/resources/unit/nojavadoclink-configuration/nojavadoclink-configuration-plugin-config.xml
+++ b/maven-jxr-plugin/src/test/resources/unit/nojavadoclink-configuration/nojavadoclink-configuration-plugin-config.xml
@@ -46,6 +46,7 @@ under the License.
           <bottom>Copyright 2006 Apache Foundation</bottom>
           <javadocVersion>1.4</javadocVersion>
           <stylesheet>stylesheet.css</stylesheet>
+          <localRepository>${localRepository}</localRepository>
         </configuration>
       </plugin>
     </plugins>
diff --git a/maven-jxr-plugin/src/test/resources/unit/pom-test/pom-test-plugin-config.xml b/maven-jxr-plugin/src/test/resources/unit/pom-test/pom-test-plugin-config.xml
index ae65ab4..257aa0b 100644
--- a/maven-jxr-plugin/src/test/resources/unit/pom-test/pom-test-plugin-config.xml
+++ b/maven-jxr-plugin/src/test/resources/unit/pom-test/pom-test-plugin-config.xml
@@ -41,6 +41,7 @@ under the License.
         <configuration>
           <project implementation="org.apache.maven.plugin.jxr.stubs.PomMavenProjectStub"/>
           <outputDirectory>${basedir}/target/test/unit/pom-test/target/site/</outputDirectory>
+          <localRepository>${localRepository}</localRepository>
         </configuration>
       </plugin>
     </plugins>
diff --git a/maven-jxr-plugin/src/test/resources/unit/testsourcedir-test/testsourcedir-test-plugin-config.xml b/maven-jxr-plugin/src/test/resources/unit/testsourcedir-test/testsourcedir-test-plugin-config.xml
index 6f08c17..23bccd9 100644
--- a/maven-jxr-plugin/src/test/resources/unit/testsourcedir-test/testsourcedir-test-plugin-config.xml
+++ b/maven-jxr-plugin/src/test/resources/unit/testsourcedir-test/testsourcedir-test-plugin-config.xml
@@ -44,6 +44,7 @@ under the License.
           <bottom>Copyright 2006 Apache Foundation</bottom>
           <javadocVersion>1.4</javadocVersion>
           <stylesheet>stylesheet.css</stylesheet>
+          <localRepository>${localRepository}</localRepository>
         </configuration>
       </plugin>
     </plugins>
diff --git a/pom.xml b/pom.xml
index af3c055..0e3e8ce 100644
--- a/pom.xml
+++ b/pom.xml
@@ -64,7 +64,7 @@ under the License.
 
   <properties>
     <javaVersion>8</javaVersion>
-    <sitePluginVersion>3.12.0</sitePluginVersion>
+    <sitePluginVersion>4.0.0-M3</sitePluginVersion>
     <javadocPluginVersion>3.4.0</javadocPluginVersion>
     <maven.site.path>jxr-archives/jxr-LATEST</maven.site.path>
     <checkstyle.violation.ignore>None</checkstyle.violation.ignore>