You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2022/02/24 16:02:19 UTC

[maven-compiler-plugin] branch mvn4 updated: Switch a few core plugins to the new api

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

gnodet pushed a commit to branch mvn4
in repository https://gitbox.apache.org/repos/asf/maven-compiler-plugin.git


The following commit(s) were added to refs/heads/mvn4 by this push:
     new f8756af  Switch a few core plugins to the new api
f8756af is described below

commit f8756af72d1cd684cc39188eaba41545461cf662
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Thu Feb 24 17:00:56 2022 +0100

    Switch a few core plugins to the new api
---
 pom.xml                                            |  25 +-
 .../main/java/org/issue/SourcePathReadGoal.java    |   5 +-
 .../main/java/org/issue/SourcePathReadGoal.java    |   5 +-
 .../apache/maven/plugin/AbstractCompilerMojo.java  |  38 ---
 .../maven/plugin/CompilationFailureException.java  |  40 ---
 .../java/org/apache/maven/plugin/CompilerMojo.java |  34 --
 .../org/apache/maven/plugin/TestCompilerMojo.java  |  34 --
 .../plugin/compiler/AbstractCompilerMojo.java      | 303 ++++++++---------
 .../compiler/CompilationFailureException.java      |   4 +-
 .../apache/maven/plugin/compiler/CompilerMojo.java |  68 ++--
 .../plugin/compiler/IncrementalBuildHelper.java    | 362 +++++++++++++++++++++
 .../compiler/IncrementalBuildHelperRequest.java    |  76 +++++
 .../maven/plugin/compiler/TestCompilerMojo.java    |  48 +--
 .../plugin/compiler/CompilerMojoTestCase.java      |  20 +-
 14 files changed, 647 insertions(+), 415 deletions(-)

diff --git a/pom.xml b/pom.xml
index 550c5c6..27d1c73 100644
--- a/pom.xml
+++ b/pom.xml
@@ -76,7 +76,7 @@ under the License.
     <javaVersion>8</javaVersion>
     <maven.it.failure.ignore>false</maven.it.failure.ignore>
     <surefire.version>2.22.2</surefire.version>
-    <mavenPluginToolsVersion>3.6.2</mavenPluginToolsVersion>
+    <mavenPluginToolsVersion>3.6.5-SNAPSHOT</mavenPluginToolsVersion>
     <project.build.outputTimestamp>2022-01-09T12:19:13Z</project.build.outputTimestamp>
   </properties>
 
@@ -97,27 +97,10 @@ under the License.
     </dependencies>
   </dependencyManagement>
   <dependencies>
-    <dependency>
-      <groupId>org.apache.maven.plugin-tools</groupId>
-      <artifactId>maven-plugin-annotations</artifactId>
-      <scope>provided</scope>
-    </dependency>
     <!-- Maven -->
     <dependency>
       <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-      <version>${mavenVersion}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-artifact</artifactId>
-      <version>${mavenVersion}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-core</artifactId>
+      <artifactId>maven-core-api</artifactId>
       <version>${mavenVersion}</version>
       <scope>provided</scope>
     </dependency>
@@ -126,10 +109,11 @@ under the License.
       <artifactId>maven-shared-utils</artifactId>
       <version>4.0.0-SNAPSHOT</version>
     </dependency>
+    <!--
     <dependency>
       <groupId>org.apache.maven.shared</groupId>
       <artifactId>maven-shared-incremental</artifactId>
-      <version>1.1</version>
+      <version>2.0.0-SNAPSHOT</version>
       <exclusions>
         <exclusion>
           <artifactId>maven-core</artifactId>
@@ -145,6 +129,7 @@ under the License.
         </exclusion>
       </exclusions>
     </dependency>
+    -->
 
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
diff --git a/src/it/MCOMPILER-157/annotation-verify/src/main/java/org/issue/SourcePathReadGoal.java b/src/it/MCOMPILER-157/annotation-verify/src/main/java/org/issue/SourcePathReadGoal.java
index aafec6f..aad8dce 100644
--- a/src/it/MCOMPILER-157/annotation-verify/src/main/java/org/issue/SourcePathReadGoal.java
+++ b/src/it/MCOMPILER-157/annotation-verify/src/main/java/org/issue/SourcePathReadGoal.java
@@ -24,7 +24,6 @@ import java.io.IOException;
 import java.util.List;
 
 import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
@@ -49,7 +48,7 @@ public class SourcePathReadGoal
 
     @SuppressWarnings( "unchecked" )
     public void execute()
-        throws MojoExecutionException, MojoFailureException
+        throws MojoExecutionException
     {
         if ( sourceClass != null )
         {
@@ -65,7 +64,7 @@ public class SourcePathReadGoal
     }
 
     private void assertGeneratedSourceFileFor( String sourceClass, List<String> sourceRoots )
-        throws MojoFailureException, MojoExecutionException
+        throws MojoExecutionException
     {
         String sourceFile = sourceClass.replace( '.', '/' )
                                        .concat( ".txt" );
diff --git a/src/it/MCOMPILER-203-processorpath/annotation-verify/src/main/java/org/issue/SourcePathReadGoal.java b/src/it/MCOMPILER-203-processorpath/annotation-verify/src/main/java/org/issue/SourcePathReadGoal.java
index 971870f..28450c2 100644
--- a/src/it/MCOMPILER-203-processorpath/annotation-verify/src/main/java/org/issue/SourcePathReadGoal.java
+++ b/src/it/MCOMPILER-203-processorpath/annotation-verify/src/main/java/org/issue/SourcePathReadGoal.java
@@ -24,7 +24,6 @@ import java.io.IOException;
 import java.util.List;
 
 import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
@@ -49,7 +48,7 @@ public class SourcePathReadGoal
 
     @SuppressWarnings( "unchecked" )
     public void execute()
-        throws MojoExecutionException, MojoFailureException
+        throws MojoExecutionException
     {
         if ( sourceClass != null )
         {
@@ -65,7 +64,7 @@ public class SourcePathReadGoal
     }
 
     private void assertGeneratedSourceFileFor( String sourceClass, List<String> sourceRoots )
-        throws MojoFailureException, MojoExecutionException
+        throws MojoExecutionException
     {
         String sourceFile = sourceClass.replace( '.', '/' )
                                        .concat( ".txt" );
diff --git a/src/main/java/org/apache/maven/plugin/AbstractCompilerMojo.java b/src/main/java/org/apache/maven/plugin/AbstractCompilerMojo.java
deleted file mode 100644
index 4a69cfc..0000000
--- a/src/main/java/org/apache/maven/plugin/AbstractCompilerMojo.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.apache.maven.plugin;
-
-/*
- * 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.
- */
-
-/**
- * TODO: At least one step could be optimized, currently the plugin will do two
- * scans of all the source code if the compiler has to have the entire set of
- * sources. This is currently the case for at least the C# compiler and most
- * likely all the other .NET compilers too.
- *
- * @author others
- * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
- * @since 2.0
- * @deprecated package change since 3.0
- */
-@Deprecated
-public abstract class AbstractCompilerMojo
-    extends org.apache.maven.plugin.compiler.AbstractCompilerMojo
-{
-    // no op only here for backward comp
-}
diff --git a/src/main/java/org/apache/maven/plugin/CompilationFailureException.java b/src/main/java/org/apache/maven/plugin/CompilationFailureException.java
deleted file mode 100644
index dbf8c3d..0000000
--- a/src/main/java/org/apache/maven/plugin/CompilationFailureException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.apache.maven.plugin;
-
-/*
- * 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 org.codehaus.plexus.compiler.CompilerMessage;
-
-import java.util.List;
-
-/**
- * @author <a href="mailto:jason@maven.org">Jason van Zyl</a>
- * @version $Id$
- * @deprecated package change since 3.0
- */
-@SuppressWarnings ( "serial" )
-@Deprecated
-public class CompilationFailureException
-    extends org.apache.maven.plugin.compiler.CompilationFailureException
-{
-    public CompilationFailureException( List<CompilerMessage> messages )
-    {
-        super( messages );
-    }
-}
diff --git a/src/main/java/org/apache/maven/plugin/CompilerMojo.java b/src/main/java/org/apache/maven/plugin/CompilerMojo.java
deleted file mode 100644
index 20a1fa1..0000000
--- a/src/main/java/org/apache/maven/plugin/CompilerMojo.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.apache.maven.plugin;
-
-/*
- * 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.
- */
-
-/**
- * Compiles application sources
- *
- * @author <a href="mailto:jason@maven.org">Jason van Zyl </a>
- * @since 2.0
- * @deprecated package change since 3.0
- */
-@Deprecated
-public class CompilerMojo
-    extends org.apache.maven.plugin.compiler.CompilerMojo
-{
-    // no op only here for backward comp
-}
diff --git a/src/main/java/org/apache/maven/plugin/TestCompilerMojo.java b/src/main/java/org/apache/maven/plugin/TestCompilerMojo.java
deleted file mode 100644
index 021d4db..0000000
--- a/src/main/java/org/apache/maven/plugin/TestCompilerMojo.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.apache.maven.plugin;
-
-/*
- * 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.
- */
-
-/**
- * Compiles application test sources.
- *
- * @author <a href="mailto:jason@maven.org">Jason van Zyl</a>
- * @since 2.0
- * @deprecated package change since 3.0
- */
-@Deprecated
-public class TestCompilerMojo
-    extends org.apache.maven.plugin.compiler.TestCompilerMojo
-{
-    // no op only here for backward comp
-}
diff --git a/src/main/java/org/apache/maven/plugin/compiler/AbstractCompilerMojo.java b/src/main/java/org/apache/maven/plugin/compiler/AbstractCompilerMojo.java
index 93fa6aa..29c6e07 100644
--- a/src/main/java/org/apache/maven/plugin/compiler/AbstractCompilerMojo.java
+++ b/src/main/java/org/apache/maven/plugin/compiler/AbstractCompilerMojo.java
@@ -22,7 +22,6 @@ package org.apache.maven.plugin.compiler;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.nio.charset.Charset;
 import java.nio.file.Files;
@@ -37,34 +36,26 @@ import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Properties;
 import java.util.Set;
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.DefaultArtifact;
-import org.apache.maven.artifact.handler.ArtifactHandler;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
-import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
-import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
-import org.apache.maven.artifact.resolver.ResolutionErrorHandler;
-import org.apache.maven.artifact.versioning.VersionRange;
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecution;
-import org.apache.maven.plugin.MojoExecutionException;
+import java.util.stream.Collectors;
+
+import org.apache.maven.api.MojoExecution;
+import org.apache.maven.api.Project;
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Toolchain;
+import org.apache.maven.api.plugin.Mojo;
+import org.apache.maven.api.plugin.MojoException;
+import org.apache.maven.api.services.ProjectManager;
+import org.apache.maven.api.services.ToolchainManager;
 import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.repository.RepositorySystem;
-import org.apache.maven.shared.incremental.IncrementalBuildHelper;
-import org.apache.maven.shared.incremental.IncrementalBuildHelperRequest;
 import org.apache.maven.shared.utils.ReaderFactory;
 import org.apache.maven.shared.utils.StringUtils;
 import org.apache.maven.shared.utils.io.FileUtils;
 import org.apache.maven.shared.utils.logging.MessageBuilder;
 import org.apache.maven.shared.utils.logging.MessageUtils;
-import org.apache.maven.toolchain.Toolchain;
-import org.apache.maven.toolchain.ToolchainManager;
 import org.codehaus.plexus.compiler.Compiler;
 import org.codehaus.plexus.compiler.CompilerConfiguration;
 import org.codehaus.plexus.compiler.CompilerError;
@@ -82,6 +73,8 @@ import org.codehaus.plexus.compiler.util.scan.mapping.SourceMapping;
 import org.codehaus.plexus.compiler.util.scan.mapping.SuffixMapping;
 import org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor;
 import org.codehaus.plexus.languages.java.version.JavaVersion;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * TODO: At least one step could be optimized, currently the plugin will do two
@@ -93,8 +86,7 @@ import org.codehaus.plexus.languages.java.version.JavaVersion;
  * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
  * @since 2.0
  */
-public abstract class AbstractCompilerMojo
-    extends AbstractMojo
+public abstract class AbstractCompilerMojo implements Mojo
 {
     protected static final String PS = System.getProperty( "path.separator" );
 
@@ -104,7 +96,9 @@ public abstract class AbstractCompilerMojo
     
     // Used to compare with older targets
     static final String MODULE_INFO_TARGET = "1.9";
-    
+
+    protected final Logger logger = LoggerFactory.getLogger( getClass() );
+
     // ----------------------------------------------------------------------
     // Configurables
     // ----------------------------------------------------------------------
@@ -446,14 +440,14 @@ public abstract class AbstractCompilerMojo
      * The current build session instance. This is used for toolchain manager API calls.
      */
     @Parameter( defaultValue = "${session}", readonly = true, required = true )
-    private MavenSession session;
+    private Session session;
 
     /**
      * The current project instance. This is used for propagating generated-sources paths as compile/testCompile source
      * roots.
      */
     @Parameter( defaultValue = "${project}", readonly = true, required = true )
-    private MavenProject project;
+    private Project project;
 
     /**
      * Strategy to re use javacc class created:
@@ -521,22 +515,15 @@ public abstract class AbstractCompilerMojo
     private boolean useIncrementalCompilation = true;
 
     /**
-     * Resolves the artifacts needed.
-     */
-    @Component
-    private RepositorySystem repositorySystem;
-
-    /**
-     * Artifact handler manager.
+     * Manages projects
      */
     @Component
-    private ArtifactHandlerManager artifactHandlerManager;
+    private ProjectManager projectManager;
 
-    /**
-     * Throws an exception on artifact resolution errors.
-     */
-    @Component
-    private ResolutionErrorHandler resolutionErrorHandler;
+    public ProjectManager getProjectManager()
+    {
+        return projectManager;
+    }
 
     protected abstract SourceInclusionScanner getSourceInclusionScanner( int staleMillis );
 
@@ -566,7 +553,7 @@ public abstract class AbstractCompilerMojo
 
     protected abstract File getGeneratedSourcesDirectory();
 
-    protected final MavenProject getProject()
+    protected final Project getProject()
     {
         return project;
     }
@@ -575,7 +562,7 @@ public abstract class AbstractCompilerMojo
 
     @Override
     public void execute()
-        throws MojoExecutionException, CompilationFailureException
+        throws MojoException, CompilationFailureException
     {
         // ----------------------------------------------------------------------
         // Look up the compiler. This is done before other code than can
@@ -585,7 +572,7 @@ public abstract class AbstractCompilerMojo
 
         Compiler compiler;
 
-        getLog().debug( "Using compiler '" + compilerId + "'." );
+        logger.debug( "Using compiler '" + compilerId + "'." );
 
         try
         {
@@ -593,7 +580,7 @@ public abstract class AbstractCompilerMojo
         }
         catch ( NoSuchCompilerException e )
         {
-            throw new MojoExecutionException( "No such compiler '" + e.getCompilerId() + "'." );
+            throw new MojoException( "No such compiler '" + e.getCompilerId() + "'." );
         }
 
         //-----------toolchains start here ----------------------------------
@@ -601,10 +588,10 @@ public abstract class AbstractCompilerMojo
         Toolchain tc = getToolchain();
         if ( tc != null )
         {
-            getLog().info( "Toolchain in maven-compiler-plugin: " + tc );
+            logger.info( "Toolchain in maven-compiler-plugin: " + tc );
             if ( executable != null )
             {
-                getLog().warn( "Toolchains are ignored, 'executable' parameter is set to " + executable );
+                logger.warn( "Toolchains are ignored, 'executable' parameter is set to " + executable );
             }
             else
             {
@@ -621,7 +608,7 @@ public abstract class AbstractCompilerMojo
 
         if ( compileSourceRoots.isEmpty() )
         {
-            getLog().info( "No sources to compile" );
+            logger.info( "No sources to compile" );
 
             return;
         }
@@ -635,7 +622,7 @@ public abstract class AbstractCompilerMojo
 
             writePlugin( mb );
 
-            getLog().warn( mb.toString() );
+            logger.warn( mb.toString() );
         }
 
         // ----------------------------------------------------------------------
@@ -700,26 +687,26 @@ public abstract class AbstractCompilerMojo
 
             if ( isTestCompile() )
             {
-                getLog().debug( "Adding " + generatedSourcesPath + " to test-compile source roots:\n  "
-                                    + StringUtils.join( project.getTestCompileSourceRoots()
+                logger.debug( "Adding " + generatedSourcesPath + " to test-compile source roots:\n  "
+                                    + StringUtils.join( projectManager.getTestCompileSourceRoots( project )
                                                                .iterator(), "\n  " ) );
 
-                project.addTestCompileSourceRoot( generatedSourcesPath );
+                projectManager.addTestCompileSourceRoot( project, generatedSourcesPath );
 
-                getLog().debug( "New test-compile source roots:\n  "
-                                    + StringUtils.join( project.getTestCompileSourceRoots()
+                logger.debug( "New test-compile source roots:\n  "
+                                    + StringUtils.join( projectManager.getTestCompileSourceRoots( project )
                                                                .iterator(), "\n  " ) );
             }
             else
             {
-                getLog().debug( "Adding " + generatedSourcesPath + " to compile source roots:\n  "
-                                    + StringUtils.join( project.getCompileSourceRoots()
+                logger.debug( "Adding " + generatedSourcesPath + " to compile source roots:\n  "
+                                    + StringUtils.join( projectManager.getCompileSourceRoots( project )
                                                                .iterator(), "\n  " ) );
 
-                project.addCompileSourceRoot( generatedSourcesPath );
+                projectManager.addCompileSourceRoot( project, generatedSourcesPath );
 
-                getLog().debug( "New compile source roots:\n  " + StringUtils.join( project.getCompileSourceRoots()
-                                                                                           .iterator(), "\n  " ) );
+                logger.debug( "New compile source roots:\n  " + StringUtils.join(
+                        projectManager.getCompileSourceRoots( project ).iterator(), "\n  " ) );
             }
         }
 
@@ -745,7 +732,7 @@ public abstract class AbstractCompilerMojo
                 }
                 else
                 {
-                    getLog().info( "Invalid value for meminitial '" + meminitial + "'. Ignoring this option." );
+                    logger.info( "Invalid value for meminitial '" + meminitial + "'. Ignoring this option." );
                 }
             }
 
@@ -759,7 +746,7 @@ public abstract class AbstractCompilerMojo
                 }
                 else
                 {
-                    getLog().info( "Invalid value for maxmem '" + maxmem + "'. Ignoring this option." );
+                    logger.info( "Invalid value for maxmem '" + maxmem + "'. Ignoring this option." );
                 }
             }
         }
@@ -785,7 +772,7 @@ public abstract class AbstractCompilerMojo
             {
                 if ( !skipMultiThreadWarning )
                 {
-                    getLog().warn( "You are in a multi-thread build and compilerReuseStrategy is set to reuseSame."
+                    logger.warn( "You are in a multi-thread build and compilerReuseStrategy is set to reuseSame."
                                        + " This can cause issues in some environments (os/jdk)!"
                                        + " Consider using reuseCreated strategy."
                                        + System.getProperty( "line.separator" )
@@ -802,13 +789,13 @@ public abstract class AbstractCompilerMojo
             compilerConfiguration.setCompilerReuseStrategy( CompilerConfiguration.CompilerReuseStrategy.ReuseCreated );
         }
 
-        getLog().debug( "CompilerReuseStrategy: " + compilerConfiguration.getCompilerReuseStrategy().getStrategy() );
+        logger.debug( "CompilerReuseStrategy: " + compilerConfiguration.getCompilerReuseStrategy().getStrategy() );
 
         compilerConfiguration.setForceJavacCompilerUse( forceJavacCompilerUse );
 
         boolean canUpdateTarget;
 
-        IncrementalBuildHelper incrementalBuildHelper = new IncrementalBuildHelper( mojoExecution, session );
+        IncrementalBuildHelper incrementalBuildHelper = new IncrementalBuildHelper( mojoExecution, project );
 
         final Set<File> sources;
 
@@ -816,7 +803,7 @@ public abstract class AbstractCompilerMojo
 
         if ( useIncrementalCompilation )
         {
-            getLog().debug( "useIncrementalCompilation enabled" );
+            logger.debug( "useIncrementalCompilation enabled" );
             try
             {
                 canUpdateTarget = compiler.canUpdateTarget( compilerConfiguration );
@@ -834,25 +821,25 @@ public abstract class AbstractCompilerMojo
                     || incrementalBuildHelper.inputFileTreeChanged( incrementalBuildHelperRequest ) )
                     // CHECKSTYLE_ON: LineLength
                 {
-                    getLog().info( "Changes detected - recompiling the module!" );
+                    logger.info( "Changes detected - recompiling the module!" );
 
                     compilerConfiguration.setSourceFiles( sources );
                 }
                 else
                 {
-                    getLog().info( "Nothing to compile - all classes are up to date" );
+                    logger.info( "Nothing to compile - all classes are up to date" );
 
                     return;
                 }
             }
             catch ( CompilerException e )
             {
-                throw new MojoExecutionException( "Error while computing stale sources.", e );
+                throw new MojoException( "Error while computing stale sources.", e );
             }
         }
         else
         {
-            getLog().debug( "useIncrementalCompilation disabled" );
+            logger.debug( "useIncrementalCompilation disabled" );
             
             Set<File> staleSources;
             try
@@ -865,7 +852,7 @@ public abstract class AbstractCompilerMojo
                 if ( compiler.getCompilerOutputStyle().equals( CompilerOutputStyle.ONE_OUTPUT_FILE_FOR_ALL_INPUT_FILES )
                     && !canUpdateTarget )
                 {
-                    getLog().info( "RESCANNING!" );
+                    logger.info( "RESCANNING!" );
                     // TODO: This second scan for source files is sub-optimal
                     String inputFileEnding = compiler.getInputFileEnding( compilerConfiguration );
 
@@ -876,12 +863,12 @@ public abstract class AbstractCompilerMojo
             }
             catch ( CompilerException e )
             {
-                throw new MojoExecutionException( "Error while computing stale sources.", e );
+                throw new MojoException( "Error while computing stale sources.", e );
             }
 
             if ( staleSources.isEmpty() )
             {
-                getLog().info( "Nothing to compile - all classes are up to date" );
+                logger.info( "Nothing to compile - all classes are up to date" );
 
                 return;
             }
@@ -893,12 +880,12 @@ public abstract class AbstractCompilerMojo
                 // MCOMPILER-366: if sources contain the module-descriptor it must be used to define the modulepath
                 sources = getCompileSources( compiler, compilerConfiguration );
 
-                if ( getLog().isDebugEnabled() )
+                if ( logger.isDebugEnabled() )
                 {
-                    getLog().debug( "#sources: " + sources.size() );
+                    logger.debug( "#sources: " + sources.size() );
                     for ( File file : sources )
                     {
-                        getLog().debug( file.getPath() );
+                        logger.debug( file.getPath() );
                     }
                 }
 
@@ -906,7 +893,7 @@ public abstract class AbstractCompilerMojo
             }
             catch ( CompilerException e )
             {
-                throw new MojoExecutionException( "Error while computing stale sources.", e );
+                throw new MojoException( "Error while computing stale sources.", e );
             }
         }
        
@@ -959,29 +946,29 @@ public abstract class AbstractCompilerMojo
         // ----------------------------------------------------------------------
         // Dump configuration
         // ----------------------------------------------------------------------
-        if ( getLog().isDebugEnabled() )
+        if ( logger.isDebugEnabled() )
         {
-            getLog().debug( "Classpath:" );
+            logger.debug( "Classpath:" );
 
             for ( String s : getClasspathElements() )
             {
-                getLog().debug( " " + s );
+                logger.debug( " " + s );
             }
 
             if ( !getModulepathElements().isEmpty() )
             {
-                getLog().debug( "Modulepath:" );
+                logger.debug( "Modulepath:" );
                 for ( String s : getModulepathElements() )
                 {
-                    getLog().debug( " " + s );
+                    logger.debug( " " + s );
                 }
             }
 
-            getLog().debug( "Source roots:" );
+            logger.debug( "Source roots:" );
 
             for ( String root : getCompileSourceRoots() )
             {
-                getLog().debug( " " + root );
+                logger.debug( " " + root );
             }
 
             try
@@ -990,8 +977,8 @@ public abstract class AbstractCompilerMojo
                 {
                     if ( compilerConfiguration.getExecutable() != null )
                     {
-                        getLog().debug( "Excutable: " );
-                        getLog().debug( " " + compilerConfiguration.getExecutable() );
+                        logger.debug( "Excutable: " );
+                        logger.debug( " " + compilerConfiguration.getExecutable() );
                     }
                 }
 
@@ -1005,13 +992,13 @@ public abstract class AbstractCompilerMojo
                         sb.append( " " );
                         sb.append( cl[i] );
                     }
-                    getLog().debug( "Command line options:" );
-                    getLog().debug( sb );
+                    logger.debug( "Command line options:" );
+                    logger.debug( sb.toString() );
                 }
             }
             catch ( CompilerException ce )
             {
-                getLog().debug( ce );
+                logger.debug( ce.getMessage(), ce );
             }
         }
         
@@ -1095,7 +1082,7 @@ public abstract class AbstractCompilerMojo
                             }
                             else
                             {
-                                getLog().warn( "Can't locate " + file );
+                                logger.warn( "Can't locate " + file );
                             }
                         }
                         else if ( !values[0].equals( descriptor.name() ) )
@@ -1137,7 +1124,7 @@ public abstract class AbstractCompilerMojo
             }
             catch ( IOException e )
             {
-                getLog().warn( e.getMessage() );
+                logger.warn( e.getMessage() );
             }
         }
 
@@ -1148,7 +1135,7 @@ public abstract class AbstractCompilerMojo
 
         if ( StringUtils.isEmpty( compilerConfiguration.getSourceEncoding() ) )
         {
-            getLog().warn( "File encoding has not been set, using platform encoding " + ReaderFactory.FILE_ENCODING
+            logger.warn( "File encoding has not been set, using platform encoding " + ReaderFactory.FILE_ENCODING
                                + ", i.e. build is platform dependent!" );
         }
 
@@ -1161,7 +1148,7 @@ public abstract class AbstractCompilerMojo
 
             incrementalBuildHelper.beforeRebuildExecution( incrementalBuildHelperRequest );
 
-            getLog().debug( "incrementalBuildHelper#beforeRebuildExecution" );
+            logger.debug( "incrementalBuildHelper#beforeRebuildExecution" );
         }
 
         try
@@ -1179,20 +1166,20 @@ public abstract class AbstractCompilerMojo
         catch ( Exception e )
         {
             // TODO: don't catch Exception
-            throw new MojoExecutionException( "Fatal error compiling", e );
+            throw new MojoException( "Fatal error compiling", e );
         }
 
         if ( useIncrementalCompilation )
         {
             if ( incrementalBuildHelperRequest.getOutputDirectory().exists() )
             {
-                getLog().debug( "incrementalBuildHelper#afterRebuildExecution" );
+                logger.debug( "incrementalBuildHelper#afterRebuildExecution" );
                 // now scan the same directory again and create a diff
                 incrementalBuildHelper.afterRebuildExecution( incrementalBuildHelperRequest );
             }
             else
             {
-                getLog().debug(
+                logger.debug(
                     "skip incrementalBuildHelper#afterRebuildExecution as the output directory doesn't exist" );
             }
         }
@@ -1224,32 +1211,32 @@ public abstract class AbstractCompilerMojo
                 assert message.getKind() != CompilerMessage.Kind.ERROR
                     && message.getKind() != CompilerMessage.Kind.WARNING
                     && message.getKind() != CompilerMessage.Kind.MANDATORY_WARNING;
-                getLog().info( message.toString() );
+                logger.info( message.toString() );
             }
             if ( !warnings.isEmpty() )
             {
-                getLog().info( "-------------------------------------------------------------" );
-                getLog().warn( "COMPILATION WARNING : " );
-                getLog().info( "-------------------------------------------------------------" );
+                logger.info( "-------------------------------------------------------------" );
+                logger.warn( "COMPILATION WARNING : " );
+                logger.info( "-------------------------------------------------------------" );
                 for ( CompilerMessage warning : warnings )
                 {
-                    getLog().warn( warning.toString() );
+                    logger.warn( warning.toString() );
                 }
-                getLog().info( warnings.size() + ( ( warnings.size() > 1 ) ? " warnings " : " warning" ) );
-                getLog().info( "-------------------------------------------------------------" );
+                logger.info( warnings.size() + ( ( warnings.size() > 1 ) ? " warnings " : " warning" ) );
+                logger.info( "-------------------------------------------------------------" );
             }
 
             if ( !errors.isEmpty() )
             {
-                getLog().info( "-------------------------------------------------------------" );
-                getLog().error( "COMPILATION ERROR : " );
-                getLog().info( "-------------------------------------------------------------" );
+                logger.info( "-------------------------------------------------------------" );
+                logger.error( "COMPILATION ERROR : " );
+                logger.info( "-------------------------------------------------------------" );
                 for ( CompilerMessage error : errors )
                 {
-                    getLog().error( error.toString() );
+                    logger.error( error.toString() );
                 }
-                getLog().info( errors.size() + ( ( errors.size() > 1 ) ? " errors " : " error" ) );
-                getLog().info( "-------------------------------------------------------------" );
+                logger.info( errors.size() + ( ( errors.size() > 1 ) ? " errors " : " error" ) );
+                logger.info( "-------------------------------------------------------------" );
             }
 
             if ( !errors.isEmpty() )
@@ -1269,17 +1256,17 @@ public abstract class AbstractCompilerMojo
                 {
                     case NOTE:
                     case OTHER:
-                        getLog().info( message.toString() );
+                        logger.info( message.toString() );
                         break;
 
                     case ERROR:
-                        getLog().error( message.toString() );
+                        logger.error( message.toString() );
                         break;
 
                     case MANDATORY_WARNING:
                     case WARNING:
                     default:
-                        getLog().warn( message.toString() );
+                        logger.warn( message.toString() );
                         break;
                 }
             }
@@ -1318,7 +1305,7 @@ public abstract class AbstractCompilerMojo
      * @return all source files for the compiler
      */
     private Set<File> getCompileSources( Compiler compiler, CompilerConfiguration compilerConfiguration )
-        throws MojoExecutionException, CompilerException
+        throws MojoException, CompilerException
     {
         String inputFileEnding = compiler.getInputFileEnding( compilerConfiguration );
         if ( StringUtils.isEmpty( inputFileEnding ) )
@@ -1351,7 +1338,7 @@ public abstract class AbstractCompilerMojo
             }
             catch ( InclusionScanException e )
             {
-                throw new MojoExecutionException(
+                throw new MojoException(
                     "Error scanning source root: \'" + sourceRoot + "\' for stale files to recompile.", e );
             }
         }
@@ -1365,16 +1352,16 @@ public abstract class AbstractCompilerMojo
      * @return <code>true</code> if at least a single source file is newer than it's class file
      */
     private boolean isSourceChanged( CompilerConfiguration compilerConfiguration, Compiler compiler )
-        throws CompilerException, MojoExecutionException
+        throws CompilerException, MojoException
     {
         Set<File> staleSources =
             computeStaleSources( compilerConfiguration, compiler, getSourceInclusionScanner( staleMillis ) );
 
-        if ( getLog().isDebugEnabled() )
+        if ( logger.isDebugEnabled() )
         {
             for ( File f : staleSources )
             {
-                getLog().debug( "Stale source detected: " + f.getAbsolutePath() );
+                logger.debug( "Stale source detected: " + f.getAbsolutePath() );
             }
         }
         return !staleSources.isEmpty();
@@ -1398,7 +1385,7 @@ public abstract class AbstractCompilerMojo
         }
         catch ( Exception e )
         {
-            getLog().debug( "unable to get threadCount for the current build: " + e.getMessage() );
+            logger.debug( "unable to get threadCount for the current build: " + e.getMessage() );
         }
         return 1;
     }
@@ -1415,7 +1402,7 @@ public abstract class AbstractCompilerMojo
         }
         catch ( Exception e )
         {
-            getLog().debug( "unable to get start time for the current build: " + e.getMessage() );
+            logger.debug( "unable to get start time for the current build: " + e.getMessage() );
         }
 
         if ( buildStartTime == null )
@@ -1452,33 +1439,16 @@ public abstract class AbstractCompilerMojo
         
         if ( jdkToolchain != null )
         {
-            // Maven 3.3.1 has plugin execution scoped Toolchain Support
-            try
-            {
-                Method getToolchainsMethod =
-                    toolchainManager.getClass().getMethod( "getToolchains", MavenSession.class, String.class,
-                                                           Map.class );
-
-                @SuppressWarnings( "unchecked" )
-                List<Toolchain> tcs =
-                    (List<Toolchain>) getToolchainsMethod.invoke( toolchainManager, session, "jdk",
-                                                                  jdkToolchain );
-
-                if ( tcs != null && !tcs.isEmpty() )
-                {
-                    tc = tcs.get( 0 );
-                }
-            }
-            catch ( NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
-                | InvocationTargetException e )
+            List<Toolchain> tcs = toolchainManager.getToolchains( session, "jdk", jdkToolchain );
+            if ( tcs != null && !tcs.isEmpty() )
             {
-                // ignore
+                tc = tcs.get( 0 );
             }
         }
         
         if ( tc == null )
         {
-            tc = toolchainManager.getToolchainFromBuildContext( "jdk", session );
+            tc = toolchainManager.getToolchainFromBuildContext( session, "jdk" );
         }
         
         return tc;
@@ -1498,7 +1468,7 @@ public abstract class AbstractCompilerMojo
 
     private Set<File> computeStaleSources( CompilerConfiguration compilerConfiguration, Compiler compiler,
                                            SourceInclusionScanner scanner )
-        throws MojoExecutionException, CompilerException
+        throws MojoException, CompilerException
     {
         SourceMapping mapping = getSourceMapping( compilerConfiguration, compiler );
 
@@ -1532,7 +1502,7 @@ public abstract class AbstractCompilerMojo
             }
             catch ( InclusionScanException e )
             {
-                throw new MojoExecutionException(
+                throw new MojoException(
                     "Error scanning source root: \'" + sourceRoot + "\' for stale files to recompile.", e );
             }
         }
@@ -1541,7 +1511,7 @@ public abstract class AbstractCompilerMojo
     }
 
     private SourceMapping getSourceMapping( CompilerConfiguration compilerConfiguration, Compiler compiler )
-        throws CompilerException, MojoExecutionException
+        throws CompilerException, MojoException
     {
         CompilerOutputStyle outputStyle = compiler.getCompilerOutputStyle();
 
@@ -1559,7 +1529,7 @@ public abstract class AbstractCompilerMojo
         }
         else
         {
-            throw new MojoExecutionException( "Unknown compiler output style: '" + outputStyle + "'." );
+            throw new MojoException( "Unknown compiler output style: '" + outputStyle + "'." );
         }
         return mapping;
     }
@@ -1597,7 +1567,7 @@ public abstract class AbstractCompilerMojo
         if ( session == null )
         {
             // we just cannot determine it, so don't do anything beside logging
-            getLog().info( "Cannot determine build start date, skipping incremental build detection." );
+            logger.info( "Cannot determine build start date, skipping incremental build detection." );
             return false;
         }
 
@@ -1621,7 +1591,7 @@ public abstract class AbstractCompilerMojo
             {
                 if ( hasNewFile( artifactPath, buildStartTime ) )
                 {
-                    getLog().debug( "New dependency detected: " + artifactPath.getAbsolutePath() );
+                    logger.debug( "New dependency detected: " + artifactPath.getAbsolutePath() );
                     return true;
                 }
             }
@@ -1663,7 +1633,7 @@ public abstract class AbstractCompilerMojo
     }
 
     private List<String> resolveProcessorPathEntries()
-        throws MojoExecutionException
+        throws MojoException
     {
         if ( annotationProcessorPaths == null || annotationProcessorPaths.isEmpty() )
         {
@@ -1672,42 +1642,23 @@ public abstract class AbstractCompilerMojo
 
         try
         {
-            Set<String> elements = new LinkedHashSet<>();
-            for ( DependencyCoordinate coord : annotationProcessorPaths )
-            {
-                ArtifactHandler handler = artifactHandlerManager.getArtifactHandler( coord.getType() );
-
-                Artifact artifact = new DefaultArtifact(
-                     coord.getGroupId(),
-                     coord.getArtifactId(),
-                     VersionRange.createFromVersionSpec( coord.getVersion() ),
-                     Artifact.SCOPE_RUNTIME,
-                     coord.getType(),
-                     coord.getClassifier(),
-                     handler,
-                     false );
-
-                ArtifactResolutionRequest request = new ArtifactResolutionRequest()
-                                .setArtifact( artifact )
-                                .setResolveRoot( true )
-                                .setResolveTransitively( true )
-                                .setLocalRepository( session.getLocalRepository() )
-                                .setRemoteRepositories( project.getRemoteArtifactRepositories() );
-
-                ArtifactResolutionResult resolutionResult = repositorySystem.resolve( request );
-
-                resolutionErrorHandler.throwErrors( request, resolutionResult );
-
-                for ( Artifact resolved : resolutionResult.getArtifacts() )
-                {
-                    elements.add( resolved.getFile().getAbsolutePath() );
-                }
-            }
-            return new ArrayList<>( elements );
+            return annotationProcessorPaths.stream()
+                    .map( coord -> session.createArtifact( coord.getGroupId(), coord.getArtifactId(),
+                            coord.getClassifier(), coord.getVersion(), coord.getType() ) )
+                    .map( artifact -> session.createDependency( artifact ) )
+                    .map( dependency -> session
+                            .withRemoteRepositories( projectManager.getRepositories( project ) )
+                            .resolveDependencies( dependency ) )
+                    .flatMap( res -> res.getArtifactResults().stream() )
+                    .map( res -> res.getArtifact().getPath() )
+                    .filter( Optional::isPresent )
+                    .map( o -> o.get().toAbsolutePath().toString() )
+                    .distinct()
+                    .collect( Collectors.toList() );
         }
         catch ( Exception e )
         {
-            throw new MojoExecutionException( "Resolution of annotationProcessorPath dependencies failed: "
+            throw new MojoException( "Resolution of annotationProcessorPath dependencies failed: "
                 + e.getLocalizedMessage(), e );
         }
     }
diff --git a/src/main/java/org/apache/maven/plugin/compiler/CompilationFailureException.java b/src/main/java/org/apache/maven/plugin/compiler/CompilationFailureException.java
index 4d62454..8963130 100644
--- a/src/main/java/org/apache/maven/plugin/compiler/CompilationFailureException.java
+++ b/src/main/java/org/apache/maven/plugin/compiler/CompilationFailureException.java
@@ -19,7 +19,7 @@ package org.apache.maven.plugin.compiler;
  * under the License.
  */
 
-import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.api.plugin.MojoException;
 import org.codehaus.plexus.compiler.CompilerMessage;
 
 import java.util.List;
@@ -30,7 +30,7 @@ import java.util.List;
  */
 @SuppressWarnings( "serial" )
 public class CompilationFailureException
-    extends MojoFailureException
+        extends MojoException
 {
     private static final String LS = System.getProperty( "line.separator" );
 
diff --git a/src/main/java/org/apache/maven/plugin/compiler/CompilerMojo.java b/src/main/java/org/apache/maven/plugin/compiler/CompilerMojo.java
index 7cb94f2..dc6b19c 100644
--- a/src/main/java/org/apache/maven/plugin/compiler/CompilerMojo.java
+++ b/src/main/java/org/apache/maven/plugin/compiler/CompilerMojo.java
@@ -31,17 +31,20 @@ import java.util.Map;
 import java.util.Set;
 import java.util.Map.Entry;
 
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.MavenProject;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.JavaToolchain;
+import org.apache.maven.api.Project;
+import org.apache.maven.api.Toolchain;
+import org.apache.maven.api.plugin.MojoException;
+import org.apache.maven.api.plugin.annotations.Component;
+import org.apache.maven.api.plugin.annotations.LifecyclePhase;
+import org.apache.maven.api.plugin.annotations.Mojo;
+import org.apache.maven.api.plugin.annotations.Parameter;
+import org.apache.maven.api.plugin.annotations.ResolutionScope;
+import org.apache.maven.api.services.ArtifactManager;
+import org.apache.maven.api.services.ProjectManager;
 import org.apache.maven.shared.utils.StringUtils;
 import org.apache.maven.shared.utils.logging.MessageUtils;
-import org.apache.maven.toolchain.Toolchain;
-import org.apache.maven.toolchain.java.DefaultJavaToolChain;
 import org.codehaus.plexus.compiler.util.scan.SimpleSourceInclusionScanner;
 import org.codehaus.plexus.compiler.util.scan.SourceInclusionScanner;
 import org.codehaus.plexus.compiler.util.scan.StaleSourceScanner;
@@ -57,8 +60,8 @@ import org.codehaus.plexus.languages.java.jpms.ResolvePathsResult;
  * @author <a href="mailto:jason@maven.org">Jason van Zyl </a>
  * @since 2.0
  */
-@Mojo( name = "compile", defaultPhase = LifecyclePhase.COMPILE, threadSafe = true, 
-    requiresDependencyResolution = ResolutionScope.COMPILE )
+@Mojo( name = "compile", defaultPhase = LifecyclePhase.COMPILE,
+       requiresDependencyResolution = ResolutionScope.COMPILE )
 public class CompilerMojo
     extends AbstractCompilerMojo
 {
@@ -129,6 +132,9 @@ public class CompilerMojo
     @Parameter
     private boolean multiReleaseOutput;
 
+    @Component
+    private ArtifactManager artifactManager;
+
     final LocationManager locationManager = new LocationManager();
 
     private List<String> classpathElements;
@@ -175,24 +181,24 @@ public class CompilerMojo
     }
 
     public void execute()
-        throws MojoExecutionException, CompilationFailureException
+        throws MojoException, CompilationFailureException
     {
         if ( skipMain )
         {
-            getLog().info( "Not compiling main sources" );
+            logger.info( "Not compiling main sources" );
             return;
         }
         
         if ( multiReleaseOutput && release == null )
         {
-            throw new MojoExecutionException( "When using 'multiReleaseOutput' the release must be set" );
+            throw new MojoException( "When using 'multiReleaseOutput' the release must be set" );
         }
 
         super.execute();
 
         if ( outputDirectory.isDirectory() )
         {
-            projectArtifact.setFile( outputDirectory );
+            artifactManager.setPath( projectArtifact, outputDirectory.toPath() );
         }
     }
 
@@ -234,9 +240,9 @@ public class CompilerMojo
                                        .setMainModuleDescriptor( moduleDescriptorPath );
                 
                 Toolchain toolchain = getToolchain();
-                if ( toolchain instanceof DefaultJavaToolChain )
+                if ( toolchain instanceof JavaToolchain )
                 {
-                    request.setJdkHome( new File( ( (DefaultJavaToolChain) toolchain ).getJavaHome() ) );
+                    request.setJdkHome( new File( ( (JavaToolchain) toolchain ).getJavaHome() ) );
                 }
 
                 resolvePathsResult = locationManager.resolvePaths( request );
@@ -249,7 +255,7 @@ public class CompilerMojo
                         cause = cause.getCause();
                     }
                     String fileName = pathException.getKey().getName();
-                    getLog().warn( "Can't extract module name from " + fileName + ": " + cause.getMessage() );
+                    logger.warn( "Can't extract module name from " + fileName + ": " + cause.getMessage() );
                 }
                 
                 JavaModuleDescriptor moduleDescriptor = resolvePathsResult.getMainModuleDescriptor();
@@ -291,7 +297,7 @@ public class CompilerMojo
             }
             catch ( IOException e )
             {
-                getLog().warn( e.getMessage() );
+                logger.warn( e.getMessage() );
             }
         }
         else
@@ -326,7 +332,7 @@ public class CompilerMojo
             if ( moduleDescriptor.exports().isEmpty() )
             {
                 // application
-                getLog().info( message );
+                logger.info( message );
             }
             else
             {
@@ -336,14 +342,16 @@ public class CompilerMojo
         }
     }
     
-    private List<File> getCompileClasspathElements( MavenProject project )
+    private List<File> getCompileClasspathElements( Project project )
     {
-        // 3 is outputFolder + 2 preserved for multirelease  
-        List<File> list = new ArrayList<>( project.getArtifacts().size() + 3 );
+        // 3 is outputFolder + 2 preserved for multirelease
+        List<Artifact> artifacts = getProjectManager().getResolvedDependencies(
+                project, ProjectManager.ResolutionScope.Compile );
+        List<File> list = new ArrayList<>( artifacts.size() + 3 );
 
         if ( multiReleaseOutput )
         {
-            File versionsFolder = new File( project.getBuild().getOutputDirectory(), "META-INF/versions" );
+            File versionsFolder = new File( project.getModel().getBuild().getOutputDirectory(), "META-INF/versions" );
             
             // in reverse order
             for ( int version = Integer.parseInt( getRelease() ) - 1; version >= 9 ; version-- )
@@ -356,11 +364,11 @@ public class CompilerMojo
             }
         }
 
-        list.add( new File( project.getBuild().getOutputDirectory() ) );
+        list.add( new File( project.getModel().getBuild().getOutputDirectory() ) );
 
-        for ( Artifact a : project.getArtifacts() )
+        for ( Artifact a : artifacts )
         {
-            list.add( a.getFile() );
+            list.add( a.getPath().get().toFile() );
         }
         return list;
     }
@@ -427,8 +435,8 @@ public class CompilerMojo
     private void writeBoxedWarning( String message )
     {
         String line = StringUtils.repeat( "*", message.length() + 4 );
-        getLog().warn( line );
-        getLog().warn( "* " + MessageUtils.buffer().strong( message )  + " *" );
-        getLog().warn( line );
+        logger.warn( line );
+        logger.warn( "* " + MessageUtils.buffer().strong( message )  + " *" );
+        logger.warn( line );
     }
 }
diff --git a/src/main/java/org/apache/maven/plugin/compiler/IncrementalBuildHelper.java b/src/main/java/org/apache/maven/plugin/compiler/IncrementalBuildHelper.java
new file mode 100644
index 0000000..9732574
--- /dev/null
+++ b/src/main/java/org/apache/maven/plugin/compiler/IncrementalBuildHelper.java
@@ -0,0 +1,362 @@
+package org.apache.maven.plugin.compiler;
+
+/*
+ * 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.util.Set;
+
+import org.apache.maven.api.MojoExecution;
+import org.apache.maven.api.Project;
+import org.apache.maven.api.plugin.MojoException;
+import org.apache.maven.shared.utils.io.DirectoryScanResult;
+import org.apache.maven.shared.utils.io.DirectoryScanner;
+import org.apache.maven.shared.utils.io.FileUtils;
+
+/**
+ * Various helper methods to support incremental builds
+ */
+public class IncrementalBuildHelper
+{
+    /**
+     * the root directory to store status information about Maven executions in.
+     */
+    private static final String MAVEN_STATUS_ROOT = "maven-status";
+    public static final String CREATED_FILES_LST_FILENAME = "createdFiles.lst";
+    private static final String INPUT_FILES_LST_FILENAME = "inputFiles.lst";
+
+    private static final String[] EMPTY_ARRAY = new String[0];
+
+    /**
+     * Needed for storing the status for the incremental build support.
+     */
+    private MojoExecution mojoExecution;
+
+    /**
+     * Needed for storing the status for the incremental build support.
+     */
+    private Project mavenProject;
+
+    /**
+     * Used for detecting changes between the Mojo execution.
+     * @see #getDirectoryScanner();
+     */
+    private DirectoryScanner directoryScanner;
+
+    /**
+     * Once the {@link #beforeRebuildExecution(IncrementalBuildHelperRequest)} got
+     * called, this will contain the list of files in the build directory.
+     */
+    private String[] filesBeforeAction = new String[0];
+
+    public IncrementalBuildHelper( MojoExecution mojoExecution, Project mavenProject )
+    {
+        if ( mavenProject == null )
+        {
+            throw new IllegalArgumentException( "MavenProject must not be null!" );
+        }
+        if ( mojoExecution == null )
+        {
+            throw new IllegalArgumentException( "MojoExecution must not be null!" );
+        }
+
+        this.mavenProject = mavenProject;
+        this.mojoExecution = mojoExecution;
+    }
+
+    /**
+     * Get the existing DirectoryScanner used by this helper,
+     * or create new a DirectoryScanner if none is yet set.
+     * The DirectoryScanner is used for detecting changes in a directory
+     */
+    public DirectoryScanner getDirectoryScanner()
+    {
+        if ( directoryScanner == null )
+        {
+            directoryScanner = new DirectoryScanner();
+        }
+
+        return directoryScanner;
+    }
+
+    /**
+     * Set the DirectoryScanner which shall get used by this build helper.
+     * @param directoryScanner
+     */
+    public void setDirectoryScanner( DirectoryScanner directoryScanner )
+    {
+        this.directoryScanner = directoryScanner;
+    }
+
+    /**
+     * We use a specific status directory for each Mojo execution to store state
+     * which is needed during the next build invocation run.
+     * @return the directory for storing status information of the current Mojo execution.
+     */
+    public File getMojoStatusDirectory()
+        throws MojoException
+    {
+        if ( mojoExecution == null )
+        {
+            throw new MojoException( "MojoExecution could not get resolved" );
+        }
+
+        File buildOutputDirectory = new File( mavenProject.getModel().getBuild().getDirectory() );
+
+        //X TODO the executionId contains -cli and -mojoname
+        //X we should remove those postfixes as it should not make
+        //X any difference whether being run on the cli or via build
+        String mojoStatusPath =
+            MAVEN_STATUS_ROOT + File.separator
+                + mojoExecution.getPlugin().getArtifactId() + File.separator
+                + mojoExecution.getGoal() + File.separator + mojoExecution.getExecutionId();
+
+        File mojoStatusDir = new File( buildOutputDirectory, mojoStatusPath );
+
+        if ( !mojoStatusDir.exists() )
+        {
+            mojoStatusDir.mkdirs();
+        }
+
+        return mojoStatusDir;
+    }
+
+    /**
+     * Detect whether the list of detected files has changed since the last build.
+     * We simply load the list of files for the previous build from a status file
+     * and compare it with the new list. Afterwards we store the new list in the status file.
+     *
+     * @param incrementalBuildHelperRequest
+     * @return <code>true</code> if the set of inputFiles got changed since the last build.
+     * @throws MojoException
+     */
+    public boolean inputFileTreeChanged( IncrementalBuildHelperRequest incrementalBuildHelperRequest )
+        throws MojoException
+    {
+        File mojoConfigBase = getMojoStatusDirectory();
+        File mojoConfigFile = new File( mojoConfigBase, INPUT_FILES_LST_FILENAME );
+
+        String[] oldInputFiles = new String[0];
+
+        if ( mojoConfigFile.exists() )
+        {
+            try
+            {
+                oldInputFiles = FileUtils.fileReadArray( mojoConfigFile );
+            }
+            catch ( IOException e )
+            {
+                throw new MojoException( "Error reading old mojo status " + mojoConfigFile, e );
+            }
+        }
+
+        String[] inputFileNames = new String[incrementalBuildHelperRequest.getInputFiles().size()];
+        int i = 0;
+        for ( File inputFile : incrementalBuildHelperRequest.getInputFiles() )
+        {
+            inputFileNames[i++] = inputFile.getAbsolutePath();
+        }
+
+        DirectoryScanResult dsr = DirectoryScanner.diffFiles( oldInputFiles, inputFileNames );
+
+        try
+        {
+            FileUtils.fileWriteArray( mojoConfigFile, inputFileNames );
+        }
+        catch ( IOException e )
+        {
+            throw new MojoException( "Error while storing the mojo status", e );
+        }
+
+        return ( dsr.getFilesAdded().length > 0 || dsr.getFilesRemoved().length > 0 );
+    }
+
+    /**
+     * Detect whether the list of detected files picked up by the DirectoryScanner
+     * has changed since the last build.
+     * We simply load the list of files for the previous build from a status file
+     * and compare it with the result of the new DirectoryScanner#scan().
+     * Afterwards we store the new list in the status file.
+     *
+     * @param dirScanner
+     * @return <code>true</code> if the set of inputFiles got changed since the last build.
+     * @throws MojoException
+     */
+    public boolean inputFileTreeChanged( DirectoryScanner dirScanner )
+        throws MojoException
+    {
+        File mojoConfigBase = getMojoStatusDirectory();
+        File mojoConfigFile = new File( mojoConfigBase, INPUT_FILES_LST_FILENAME );
+
+        String[] oldInputFiles = new String[0];
+
+        if ( mojoConfigFile.exists() )
+        {
+            try
+            {
+                oldInputFiles = FileUtils.fileReadArray( mojoConfigFile );
+            }
+            catch ( IOException e )
+            {
+                throw new MojoException( "Error reading old mojo status " + mojoConfigFile, e );
+            }
+        }
+
+        dirScanner.scan();
+
+        try
+        {
+            // store away the list of input files
+            FileUtils.fileWriteArray( mojoConfigFile, dirScanner.getIncludedFiles() );
+        }
+        catch ( IOException e )
+        {
+            throw new MojoException( "Error while storing new mojo status" + mojoConfigFile, e );
+        }
+
+        DirectoryScanResult dsr = dirScanner.diffIncludedFiles( oldInputFiles );
+
+        return ( dsr.getFilesAdded().length > 0 || dsr.getFilesRemoved().length > 0 );
+    }
+
+    /**
+     * <p>
+     * This method shall get invoked before the actual Mojo task gets triggered, e.g. the actual compile in
+     * maven-compiler-plugin.
+     * </p>
+     * <p>
+     * <b>Attention:</b> This method shall only get invoked if the plugin re-creates <b>all</b> the output.
+     * </p>
+     * <p>
+     * It first picks up the list of files created in the previous build and delete them. This step is necessary to
+     * prevent left-overs. After that we take a 'directory snapshot' (list of all files which exist in the
+     * outputDirectory after the clean).
+     * </p>
+     * <p>
+     * After the actual Mojo task got executed you should invoke the method
+     * {@link #afterRebuildExecution(IncrementalBuildHelperRequest)} to collect the
+     * list of files which got changed by this task.
+     * </p>
+     *
+     * @param incrementalBuildHelperRequest
+     * @return all files which got created in the previous build and have been deleted now.
+     * @throws MojoException
+     */
+    public String[] beforeRebuildExecution( IncrementalBuildHelperRequest incrementalBuildHelperRequest )
+        throws MojoException
+    {
+        File mojoConfigBase = getMojoStatusDirectory();
+        File mojoConfigFile = new File( mojoConfigBase, CREATED_FILES_LST_FILENAME );
+
+        String[] oldFiles;
+
+        try
+        {
+            oldFiles = FileUtils.fileReadArray( mojoConfigFile );
+            for ( String oldFileName : oldFiles )
+            {
+                File oldFile = new File( incrementalBuildHelperRequest.getOutputDirectory(), oldFileName );
+                oldFile.delete();
+            }
+        }
+        catch ( IOException e )
+        {
+            throw new MojoException( "Error reading old mojo status", e );
+        }
+
+        // we remember all files which currently exist in the output directory
+        DirectoryScanner diffScanner = getDirectoryScanner();
+        diffScanner.setBasedir( incrementalBuildHelperRequest.getOutputDirectory() );
+        if ( incrementalBuildHelperRequest.getOutputDirectory().exists() )
+        {
+            diffScanner.scan();
+            filesBeforeAction = diffScanner.getIncludedFiles();
+        }
+
+        return oldFiles;
+    }
+
+    /**
+     * <p>This method collects and stores all information about files changed since the
+     * call to {@link #beforeRebuildExecution(IncrementalBuildHelperRequest)}.</p>
+     *
+     * <p><b>Attention:</b> This method shall only get invoked if the plugin re-creates <b>all</b> the output.</p>
+     *
+     * @param incrementalBuildHelperRequest will contains file sources to store if create files are not yet stored
+     *
+     * @throws MojoException
+     */
+    public void afterRebuildExecution( IncrementalBuildHelperRequest incrementalBuildHelperRequest )
+        throws MojoException
+    {
+        DirectoryScanner diffScanner = getDirectoryScanner();
+        // now scan the same directory again and create a diff
+        diffScanner.scan();
+        DirectoryScanResult scanResult = diffScanner.diffIncludedFiles( filesBeforeAction );
+
+        File mojoConfigBase = getMojoStatusDirectory();
+        File mojoConfigFile = new File( mojoConfigBase, CREATED_FILES_LST_FILENAME );
+
+        try
+        {
+            FileUtils.fileWriteArray( mojoConfigFile, scanResult.getFilesAdded() );
+        }
+        catch ( IOException e )
+        {
+            throw new MojoException( "Error while storing the mojo status", e );
+        }
+
+        // in case of clean compile the file is not created so next compile won't see it
+        // we mus create it here
+        mojoConfigFile = new File( mojoConfigBase, INPUT_FILES_LST_FILENAME );
+        if ( !mojoConfigFile.exists() )
+        {
+            try
+            {
+                FileUtils.fileWriteArray( mojoConfigFile,
+                                          toArrayOfPath( incrementalBuildHelperRequest.getInputFiles() ) );
+            }
+            catch ( IOException e )
+            {
+                throw new MojoException( "Error while storing the mojo status", e );
+            }
+        }
+
+    }
+
+    private String[] toArrayOfPath( Set<File> files )
+    {
+        if ( files == null || files.isEmpty() )
+        {
+            return EMPTY_ARRAY;
+        }
+        String[] paths = new String[files.size()];
+
+        int i = 0;
+
+        for ( File file : files )
+        {
+            paths[i] = file.getPath();
+            i++;
+        }
+
+        return paths;
+    }
+}
diff --git a/src/main/java/org/apache/maven/plugin/compiler/IncrementalBuildHelperRequest.java b/src/main/java/org/apache/maven/plugin/compiler/IncrementalBuildHelperRequest.java
new file mode 100644
index 0000000..3e2c720
--- /dev/null
+++ b/src/main/java/org/apache/maven/plugin/compiler/IncrementalBuildHelperRequest.java
@@ -0,0 +1,76 @@
+package org.apache.maven.plugin.compiler;
+
+/*
+ * 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.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Olivier Lamy
+ * @since 1.1
+ */
+public class IncrementalBuildHelperRequest
+{
+    private Set<File> inputFiles;
+
+    private File outputDirectory;
+
+    public IncrementalBuildHelperRequest()
+    {
+        // no op
+    }
+
+    public Set<File> getInputFiles()
+    {
+        if ( inputFiles == null )
+        {
+            this.inputFiles = new HashSet<File>();
+        }
+        return inputFiles;
+    }
+
+    public void setInputFiles( Set<File> inputFiles )
+    {
+        this.inputFiles = inputFiles;
+    }
+
+    public IncrementalBuildHelperRequest inputFiles( Set<File> inputFiles )
+    {
+        this.inputFiles = inputFiles;
+        return this;
+    }
+
+    public File getOutputDirectory()
+    {
+        return outputDirectory;
+    }
+
+    public void setOutputDirectory( File outputDirectory )
+    {
+        this.outputDirectory = outputDirectory;
+    }
+
+    public IncrementalBuildHelperRequest outputDirectory( File outputDirectory )
+    {
+        this.outputDirectory = outputDirectory;
+        return this;
+    }
+}
diff --git a/src/main/java/org/apache/maven/plugin/compiler/TestCompilerMojo.java b/src/main/java/org/apache/maven/plugin/compiler/TestCompilerMojo.java
index 9430ac2..55628e6 100644
--- a/src/main/java/org/apache/maven/plugin/compiler/TestCompilerMojo.java
+++ b/src/main/java/org/apache/maven/plugin/compiler/TestCompilerMojo.java
@@ -33,13 +33,13 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.toolchain.Toolchain;
-import org.apache.maven.toolchain.java.DefaultJavaToolChain;
+import org.apache.maven.api.JavaToolchain;
+import org.apache.maven.api.Toolchain;
+import org.apache.maven.api.plugin.MojoException;
+import org.apache.maven.api.plugin.annotations.LifecyclePhase;
+import org.apache.maven.api.plugin.annotations.Mojo;
+import org.apache.maven.api.plugin.annotations.Parameter;
+import org.apache.maven.api.plugin.annotations.ResolutionScope;
 import org.codehaus.plexus.compiler.util.scan.SimpleSourceInclusionScanner;
 import org.codehaus.plexus.compiler.util.scan.SourceInclusionScanner;
 import org.codehaus.plexus.compiler.util.scan.StaleSourceScanner;
@@ -54,8 +54,8 @@ import org.codehaus.plexus.languages.java.jpms.ResolvePathsResult;
  * @author <a href="mailto:jason@maven.org">Jason van Zyl</a>
  * @since 2.0
  */
-@Mojo( name = "testCompile", defaultPhase = LifecyclePhase.TEST_COMPILE, threadSafe = true,
-                requiresDependencyResolution = ResolutionScope.TEST )
+@Mojo( name = "testCompile", defaultPhase = LifecyclePhase.TEST_COMPILE,
+       requiresDependencyResolution = ResolutionScope.TEST )
 public class TestCompilerMojo
     extends AbstractCompilerMojo
 {
@@ -111,7 +111,7 @@ public class TestCompilerMojo
      * 
      * @since 3.6
      */
-    @Parameter ( property = "maven.compiler.testRelease" )
+    @Parameter( property = "maven.compiler.testRelease" )
     private String testRelease;
 
     /**
@@ -165,11 +165,11 @@ public class TestCompilerMojo
     private Collection<String> modulepathElements;
 
     public void execute()
-        throws MojoExecutionException, CompilationFailureException
+        throws MojoException, CompilationFailureException
     {
         if ( skip )
         {
-            getLog().info( "Not compiling test sources" );
+            logger.info( "Not compiling test sources" );
             return;
         }
         super.execute();
@@ -205,7 +205,7 @@ public class TestCompilerMojo
     @Override
     protected void preparePaths( Set<File> sourceFiles )
     {
-        File mainOutputDirectory = new File( getProject().getBuild().getOutputDirectory() );
+        File mainOutputDirectory = new File( getProject().getModel().getBuild().getOutputDirectory() );
 
         File mainModuleDescriptorClassFile = new File( mainOutputDirectory, "module-info.class" );
         JavaModuleDescriptor mainModuleDescriptor = null;
@@ -236,9 +236,9 @@ public class TestCompilerMojo
                                 .setMainModuleDescriptor( mainModuleDescriptorClassFile.getAbsolutePath() );
 
                 Toolchain toolchain = getToolchain();
-                if ( toolchain instanceof DefaultJavaToolChain )
+                if ( toolchain instanceof JavaToolchain )
                 {
-                    request.setJdkHome( ( (DefaultJavaToolChain) toolchain ).getJavaHome() );
+                    request.setJdkHome( ( (JavaToolchain) toolchain ).getJavaHome() );
                 }
 
                 result = locationManager.resolvePaths( request );
@@ -251,7 +251,7 @@ public class TestCompilerMojo
                         cause = cause.getCause();
                     }
                     String fileName = Paths.get( pathException.getKey() ).getFileName().toString();
-                    getLog().warn( "Can't extract module name from " + fileName + ": " + cause.getMessage() );
+                    logger.warn( "Can't extract module name from " + fileName + ": " + cause.getMessage() );
                 }
             }
             catch ( IOException e )
@@ -280,9 +280,9 @@ public class TestCompilerMojo
                                 .setMainModuleDescriptor( testModuleDescriptorJavaFile.getAbsolutePath() );
 
                 Toolchain toolchain = getToolchain();
-                if ( toolchain instanceof DefaultJavaToolChain )
+                if ( toolchain instanceof JavaToolchain )
                 {
-                    request.setJdkHome( ( (DefaultJavaToolChain) toolchain ).getJavaHome() );
+                    request.setJdkHome( ( (JavaToolchain) toolchain ).getJavaHome() );
                 }
 
                 result = locationManager.resolvePaths( request );
@@ -320,11 +320,11 @@ public class TestCompilerMojo
 
             if ( mainModuleDescriptor != null )
             {
-                if ( getLog().isDebugEnabled() )
+                if ( logger.isDebugEnabled() )
                 {
-                    getLog().debug( "Main and test module descriptors exist:" );
-                    getLog().debug( "  main module = " + mainModuleDescriptor.name() );
-                    getLog().debug( "  test module = " + testModuleDescriptor.name() );
+                    logger.debug( "Main and test module descriptors exist:" );
+                    logger.debug( "  main module = " + mainModuleDescriptor.name() );
+                    logger.debug( "  test module = " + testModuleDescriptor.name() );
                 }
 
                 if ( testModuleDescriptor.name().equals( mainModuleDescriptor.name() ) )
@@ -339,7 +339,7 @@ public class TestCompilerMojo
                     patchModuleValue.append( testModuleDescriptor.name() );
                     patchModuleValue.append( '=' );
 
-                    for ( String root : getProject().getCompileSourceRoots() )
+                    for ( String root : getProjectManager().getCompileSourceRoots( getProject() ) )
                     {
                         if ( Files.exists( Paths.get( root ) ) )
                         {
@@ -351,7 +351,7 @@ public class TestCompilerMojo
                 }
                 else
                 {
-                    getLog().debug( "Black-box testing - all is ready to compile" );
+                    logger.debug( "Black-box testing - all is ready to compile" );
                 }
             }
             else
diff --git a/src/test/java/org/apache/maven/plugin/compiler/CompilerMojoTestCase.java b/src/test/java/org/apache/maven/plugin/compiler/CompilerMojoTestCase.java
index 79d8711..55d89f0 100644
--- a/src/test/java/org/apache/maven/plugin/compiler/CompilerMojoTestCase.java
+++ b/src/test/java/org/apache/maven/plugin/compiler/CompilerMojoTestCase.java
@@ -47,6 +47,8 @@ import org.apache.maven.plugin.testing.AbstractMojoTestCase;
 import org.apache.maven.plugin.testing.stubs.ArtifactStub;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.languages.java.version.JavaVersion;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class CompilerMojoTestCase
     extends AbstractMojoTestCase
@@ -82,11 +84,9 @@ public class CompilerMojoTestCase
         throws Exception
     {
         CompilerMojo compileMojo = getCompilerMojo( "target/test-classes/unit/compiler-basic-test/plugin-config.xml" );
-        
-        Log log = mock( Log.class );
-        
-        compileMojo.setLog( log );
-        
+
+        Logger log = LoggerFactory.getLogger( compileMojo.getClass() );
+
         compileMojo.execute();
 
         File testClass = new File( compileMojo.getOutputDirectory(), "TestCompile0.class" );
@@ -103,7 +103,7 @@ public class CompilerMojoTestCase
                        projectArtifact.getFile() );
 
         testClass = new File( testCompileMojo.getOutputDirectory(), "TestCompile0Test.class" );
-        
+
         verify( log ).warn( startsWith( "No explicit value set for target or release!" ) );
 
         assertTrue( testClass.exists() );
@@ -113,11 +113,9 @@ public class CompilerMojoTestCase
                     throws Exception
     {
         CompilerMojo compileMojo = getCompilerMojo( "target/test-classes/unit/compiler-basic-sourcetarget/plugin-config.xml" );
-        
-        Log log = mock( Log.class );
-        
-        compileMojo.setLog( log );
-        
+
+        Logger log = LoggerFactory.getLogger( compileMojo.getClass() );
+
         compileMojo.execute();
         
         verify( log, never() ).warn( startsWith( "No explicit value set for target or release!" ) );