typetools / checker-framework

Pluggable type-checking for Java
http://checkerframework.org/
Other
990 stars 347 forks source link

Better instructions for working with Maven #445

Closed renatoathaydes closed 7 years ago

renatoathaydes commented 8 years ago

Hi. I submitted a few issues I had working with the checker framework, mostly due to the fact I was trying to avoid using the annotated JDK. The main reason for that was that I could not accept adding a system dependency (to a file somewhere in the local machine) or adding the jar to my source control to be able to refer to the annotated JDK jar.

After much trouble, I've come to a good solution that lets Maven take care of finding the jar and providing it to the checker framework.

I submit this issue as a request to add this to the documentation as the preferred way to use checker in Maven (similar approaches should work in Ant and Gradle).

First of all, to enable the checker framework, I simply add it as an annotation processor in the pom. This is done in the declaration of the maven-compiler-plugin. Then, I just add some compiler arguments that get passed to the NullnessChecker, like the location of my stubs (to annotate library methods), and importantly, the location of the annotated JDK in a system-independent, no setup way (Maven will download the jdk jar and figure out its location):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <fork>true</fork>
        <annotationProcessors>
            <annotationProcessor>org.checkerframework.checker.nullness.NullnessChecker
            </annotationProcessor>
        </annotationProcessors>
        <compilerArgs>
            <!-- directory containing annotated library stubs -->
            <arg>-Astubs=checkerframework/stubs</arg>
            <arg>-AstubWarnIfNotFound</arg>
            <!-- location of the annotated JDK, which just comes from a Maven dependency -->
            <arg>-Xbootclasspath/p:${annotatedJdk8}</arg>
        </compilerArgs>
    </configuration>
</plugin>

Notice that the location of the annotated JDK8 comes from the annotatedJdk8 property, which we have not yet set. To set it, two things need to be added to the pom:

<properties>
    <!-- This property will be set by the Maven Dependency plugin -->
    <annotatedJdk8>${org.checkerframework:jdk8:jar}</annotatedJdk8>
</properties>
<plugin>
    <!-- This plugin will set the properties values using dependency information -->
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.3</version>
    <executions>
        <execution>
            <goals>
                <goal>properties</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Then, of course, we need to make the jdk jar a dependency in the pom:

<dependency>
    <groupId>org.checkerframework</groupId>
    <artifactId>checker</artifactId>
    <version>1.9.3</version>
</dependency>
<dependency>
    <groupId>org.checkerframework</groupId>
    <artifactId>checker-qual</artifactId>
    <version>1.9.3</version>
</dependency>
<dependency>
    <groupId>org.checkerframework</groupId>
    <artifactId>jdk8</artifactId>
    <version>1.9.3</version>
</dependency>

This approach requires absolutely no setup in any machine where this build is run to make checker framework work.

It works best if all this configuration is done in a Maven profile, so that it's still possible to compile the code without running the checker framework. In this case, the dependencies above, as well as the maven-compiler-plugin dependency should be added inside the profile declaration... and optionally, the annotations in the Java code could come from a jar which contains only the javax.annotation annotations (eg. javax.annotation.Nullable), such as findbugs, to completely un-couple the compilation to the checker-framework:

<dependency>
    <groupId>com.google.code.findbugs</groupId>
    <artifactId>annotations</artifactId>
    <version>2.0.1</version>
</dependency>
mernst commented 8 years ago

Thanks for the suggestions. Having Maven do all the downloading of the Checker Framework is more idiomatic, so that is a good idea. Thanks! The same goes for Gradle. I'm not sure it fits as well with Ant, though.

What is the purpose of the checker-qual dependency? Is it used anywhere?

We have users who use JDK 7, so the instructions should indicate how to do that as well. Luckily, it's only a small change from what you have proposed.

Would it be possible to write your instructions as a diff to the manual? In particular, it would be nice to have explicit indications of where each of the XML snippets goes -- in what file and where in the file. A pull request would be delightful, but we could also continue the conversation here in the issue.

renatoathaydes commented 8 years ago

Hi. I'm on vacation, currently, so I have little time to make a PR, but in a few weeks I might be able to do that. I think 'checker-qual' is necessary for users who want checker-specific annotations like '@MonotonicNonNull'?

All the XML snippets go in the pom.xml file, Maven users know immediately in which session each snippet goes :) but I'm happy to make that clearer later. I might write instructions for Gradle also, if you'll wait for my PR.

Cheers.

mernst commented 8 years ago

Thanks! I appreciate it. This will be very nice for other Checker Framework and Maven/Gradle users. (The explicit discussion of where everything goes may help novice Maven users, and I think it doesn't have to be too wordy or pedantic for the experts.)

Enjoy your vacation! I look forward to hearing from you when you return.

mernst commented 8 years ago

A ping: if you are back from your vacation and have a chance to write the instructions for the manual, that would be great. Thanks!

renatoathaydes commented 8 years ago

Hi, I came back this week! Will definitely do it this week, thanks for reminding.

renatoathaydes commented 8 years ago

Here's my first PR: https://github.com/typetools/checker-framework/pull/461

renatoathaydes commented 8 years ago

I've managed to get Gradle to do the same thing as Maven and get the anotated JDK off Maven Central... and pass its local path to the Java Compiler...

When I compile with the NullnessChecker enabled, it works as expected, but it prints this:

warning: unknown enum constant Kind.NULL_LITERAL
  reason: class file for com.sun.source.tree.Tree not found
warning: unknown enum constant Kind.NULL_LITERAL
warning: unknown enum constant Kind.NEW_CLASS
warning: unknown enum constant Kind.NEW_ARRAY
warning: unknown enum constant Kind.PLUS
warning: unknown enum constant Kind.BOOLEAN_LITERAL
warning: unknown enum constant Kind.CHAR_LITERAL
warning: unknown enum constant Kind.DOUBLE_LITERAL
warning: unknown enum constant Kind.FLOAT_LITERAL
warning: unknown enum constant Kind.INT_LITERAL
warning: unknown enum constant Kind.LONG_LITERAL
warning: unknown enum constant Kind.STRING_LITERAL
warning: unknown enum constant Kind.NULL_LITERAL

It does NOT print the warning about not finding the annotated JDK... This is strange as I am using Oracle's JVM to run everything:

java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

You can check out the demo project at https://github.com/renatoathaydes/checker-gradle-demo

mernst commented 8 years ago

I haven't looked into it carefully, but here is a possibility.

The warnings about unknown enum constants look similar to the ones you reported in issue #439, where the solution was to use the correct annotated JDK. Might this one be similar?

renatoathaydes commented 8 years ago

That's what I had thought too... but in that case, it was not finding the annotated JDK... now I am sure it is finding the annotated JDK because I don't get the warning that the JDK was not found, and also, If I try to use Optional.ofNullable(null) it works fine (but when I remove the annotated JDK argument, it does not work, as expected if the annotated JDK was not found).

pdurbin commented 8 years ago

@renatoathaydes this is fantastic! Thanks! I got it working with Java 8 in https://github.com/pdurbin/maven-hello-world/commit/3c08628 but I can't get it working with Java 7. Any ideas for me? Please see details at https://github.com/pdurbin/maven-hello-world/issues/3

atomicknight commented 8 years ago

The "unknown enum constant" warnings are being raised because the nullness annotations (e.g. org.checkerframework.checker.nullness.qual.Nullable) reference an enum defined in com.sun.source.tree.Tree, which is not added to the compilation classpath by the compiler. It's easy enough to add the org.checkerframework:compiler artifact to the classpath as well, but the consequent classpath pollution seems rather undesirable.

mernst commented 8 years ago

Maybe just that enum should be added to the classpath and/or the Checker Framework jar -- if that's not too complicated or brittle and if the copyrights permit.

atomicknight commented 8 years ago

One other note: the error message parsing performed by plexus-compiler-javac is currently incorrect as it effectively throws away context that appears after the ^ character. Specifically, it prepends the context to the next error message if there is one. Consequently, the found/required lines produced by the processor are lost for the last error that is printed.

See codehaus-plexus/plexus-compiler#16

mernst commented 8 years ago

@atomicknight Thanks for pointing that out, Abraham. It sounds like a bug in plexus-compiler-javac. Would you be willing to submit a bug report (or even a fix if you see how to correct the bug)?

jefferyyuan commented 8 years ago

Could we also give instruction about how to make checker framework work in maven multiple module projects? -- As most of maven projects in enterprise are actually multiple modules maven projects.

-- I made checker work in simple maven project, but failed to make it work in modules projects. It throws exceptions:

Underlying Exception: org.checkerframework.framework.source.SourceChecker$CheckerError: InvocationTargetException when invoking constructor for class org.checkerframework.checker.nullness.KeyForAnnotatedTypeFactory; Underlying cause: Could not load class 'org.checkerframework.checker.nullness.qual.UnknownKeyFor' for field 'value' in annotation @org.checkerframework.framework.qual.PolymorphicQualifier(org.checkerframework.checker.nullness.qual.UnknownKeyFor.class); Stack trace: org.checkerframework.framework.source.SourceChecker.errorAbort(SourceChecker.java:682)

Thanks...

mernst commented 8 years ago

@jefferyyuan, can you be more specific? You didn't say what you did nor give a reproducible test case, and that makes it difficult for other people to help you. Thanks.

Also, this text is identical to something sent to the checker-framework-discuss mailing list. Please post your information in one place rather than having identical text in two different places.

jefferyyuan commented 8 years ago

@mernst thanks so much for your quick reply and sorry for the duplicate post.

The problem is not related with maven modules, but related with google errorprone. We tried to use both checker framework and errorprone. but seems it can't woek together. -- With only errorprone or only checker, it works.

Is there a way that we can run both? Thanks

At first it throws: error: InvocationTargetException when invoking constructor for class org.checkerframework.checker.nullness.KeyForVisitor; Underlying cause: InvocationTargetException when invoking constructor for class org.checkerframework.checker.nullness.KeyForAnnotatedTypeFactory; Underlying cause: Could not load class 'org.checkerframework.framework.qual.PolymorphicQualifier' for field 'value' in annotation @org.checkerframework.framework.qual.PolymorphicQualifier Exception: java.lang.reflect.InvocationTargetException; Stack trace: sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) java.lang.reflect.Constructor.newInstance(Constructor.java:422) org.checkerframework.common.basetype.BaseTypeChecker.invokeConstructorFor(BaseTypeChecker.java:270) org.checkerframework.common.basetype.BaseTypeChecker.createSourceVisitor(BaseTypeChecker.java:205) org.checkerframework.common.basetype.BaseTypeChecker.createSourceVisitor(BaseTypeChecker.java:99) org.checkerframework.framework.source.SourceChecker.initChecker(SourceChecker.java:792) org.checkerframework.common.basetype.BaseTypeChecker.initChecker(BaseTypeChecker.java:114) org.checkerframework.common.basetype.BaseTypeChecker.initChecker(BaseTypeChecker.java:105) org.checkerframework.framework.source.SourceChecker.typeProcessingStart(SourceChecker.java:753) org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:183) com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:707) com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:113) com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1303) com.google.errorprone.ErrorProneJavacJavaCompiler.flow(ErrorProneJavacJavaCompiler.java:95) com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1247) com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:858) com.sun.tools.javac.main.Main.compile(Main.java:253) com.google.errorprone.ErrorProneCompiler.run(ErrorProneCompiler.java:249) com.google.errorprone.ErrorProneCompiler.run(ErrorProneCompiler.java:159) com.google.errorprone.ErrorProneCompiler.compile(ErrorProneCompiler.java:88) org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne$CompilerInvoker.compile(JavacCompilerWithErrorProne.java:219) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:497) org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne.performCompile(JavacCompilerWithErrorProne.java:91) org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:825) org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:129) org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116) org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120) org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:355) org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155) org.apache.maven.cli.MavenCli.execute(MavenCli.java:584) org.apache.maven.cli.MavenCli.doMain(MavenCli.java:216) org.apache.maven.cli.MavenCli.main(MavenCli.java:160) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:497) org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) Underlying Exception: org.checkerframework.framework.source.SourceChecker$CheckerError: InvocationTargetException when invoking constructor for class org.checkerframework.checker.nullness.KeyForAnnotatedTypeFactory; Underlying cause: Could not load class 'org.checkerframework.framework.qual.PolymorphicQualifier' for field 'value' in annotation @org.checkerframework.framework.qual.PolymorphicQualifier; Stack trace: org.checkerframework.framework.source.SourceChecker.errorAbort(SourceChecker.java:682) org.checkerframework.javacutil.ErrorReporter.errorAbort(ErrorReporter.java:36) org.checkerframework.common.basetype.BaseTypeChecker.invokeConstructorFor(BaseTypeChecker.java:286) org.checkerframework.common.basetype.BaseTypeVisitor.createTypeFactory(BaseTypeVisitor.java:244) org.checkerframework.common.basetype.BaseTypeVisitor.(BaseTypeVisitor.java:200) org.checkerframework.checker.nullness.KeyForVisitor.(KeyForVisitor.java:31) sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) java.lang.reflect.Constructor.newInstance(Constructor.java:422) org.checkerframework.common.basetype.BaseTypeChecker.invokeConstructorFor(BaseTypeChecker.java:270) org.checkerframework.common.basetype.BaseTypeChecker.createSourceVisitor(BaseTypeChecker.java:205) org.checkerframework.common.basetype.BaseTypeChecker.createSourceVisitor(BaseTypeChecker.java:99) org.checkerframework.framework.source.SourceChecker.initChecker(SourceChecker.java:792) org.checkerframework.common.basetype.BaseTypeChecker.initChecker(BaseTypeChecker.java:114) org.checkerframework.common.basetype.BaseTypeChecker.initChecker(BaseTypeChecker.java:105) org.checkerframework.framework.source.SourceChecker.typeProcessingStart(SourceChecker.java:753) org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:183) com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:707) com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:113) com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1303) com.google.errorprone.ErrorProneJavacJavaCompiler.flow(ErrorProneJavacJavaCompiler.java:95) com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1247) com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:858) com.sun.tools.javac.main.Main.compile(Main.java:253) com.google.errorprone.ErrorProneCompiler.run(ErrorProneCompiler.java:249) com.google.errorprone.ErrorProneCompiler.run(ErrorProneCompiler.java:159) com.google.errorprone.ErrorProneCompiler.compile(ErrorProneCompiler.java:88) org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne$CompilerInvoker.compile(JavacCompilerWithErrorProne.java:219) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:497) org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne.performCompile(JavacCompilerWithErrorProne.java:91) org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:825) org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:129) org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116) org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120) org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:355) org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155) org.apache.maven.cli.MavenCli.execute(MavenCli.java:584) org.apache.maven.cli.MavenCli.doMain(MavenCli.java:216) org.apache.maven.cli.MavenCli.main(MavenCli.java:160) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:497) org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) Underlying Exception: java.lang.reflect.InvocationTargetException; Stack trace: sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) java.lang.reflect.Constructor.newInstance(Constructor.java:422) org.checkerframework.common.basetype.BaseTypeChecker.invokeConstructorFor(BaseTypeChecker.java:270) org.checkerframework.common.basetype.BaseTypeVisitor.createTypeFactory(BaseTypeVisitor.java:244) org.checkerframework.common.basetype.BaseTypeVisitor.(BaseTypeVisitor.java:200) org.checkerframework.checker.nullness.KeyForVisitor.(KeyForVisitor.java:31) sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) java.lang.reflect.Constructor.newInstance(Constructor.java:422) org.checkerframework.common.basetype.BaseTypeChecker.invokeConstructorFor(BaseTypeChecker.java:270) org.checkerframework.common.basetype.BaseTypeChecker.createSourceVisitor(BaseTypeChecker.java:205) org.checkerframework.common.basetype.BaseTypeChecker.createSourceVisitor(BaseTypeChecker.java:99) org.checkerframework.framework.source.SourceChecker.initChecker(SourceChecker.java:792) org.checkerframework.common.basetype.BaseTypeChecker.initChecker(BaseTypeChecker.java:114) org.checkerframework.common.basetype.BaseTypeChecker.initChecker(BaseTypeChecker.java:105) org.checkerframework.framework.source.SourceChecker.typeProcessingStart(SourceChecker.java:753) org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:183) com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:707) com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:113) com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1303) com.google.errorprone.ErrorProneJavacJavaCompiler.flow(ErrorProneJavacJavaCompiler.java:95) com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1247) com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:858) com.sun.tools.javac.main.Main.compile(Main.java:253) com.google.errorprone.ErrorProneCompiler.run(ErrorProneCompiler.java:249) com.google.errorprone.ErrorProneCompiler.run(ErrorProneCompiler.java:159) com.google.errorprone.ErrorProneCompiler.compile(ErrorProneCompiler.java:88) org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne$CompilerInvoker.compile(JavacCompilerWithErrorProne.java:219) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:497) org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne.performCompile(JavacCompilerWithErrorProne.java:91) org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:825) org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:129) org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116) org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120) org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:355) org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155) org.apache.maven.cli.MavenCli.execute(MavenCli.java:584) org.apache.maven.cli.MavenCli.doMain(MavenCli.java:216) org.apache.maven.cli.MavenCli.main(MavenCli.java:160) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:497) org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) Underlying Exception: org.checkerframework.framework.source.SourceChecker$CheckerError: Could not load class 'org.checkerframework.framework.qual.PolymorphicQualifier' for field 'value' in annotation @org.checkerframework.framework.qual.PolymorphicQualifier; Stack trace: org.checkerframework.framework.source.SourceChecker.errorAbort(SourceChecker.java:682) org.checkerframework.javacutil.ErrorReporter.errorAbort(ErrorReporter.java:36) org.checkerframework.javacutil.AnnotationUtils.getElementValueClass(AnnotationUtils.java:514) org.checkerframework.framework.util.QualifierPolymorphism.getPolymorphicQualifierTop(QualifierPolymorphism.java:168) org.checkerframework.framework.util.MultiGraphQualifierHierarchy$MultiGraphFactory.addQualifier(MultiGraphQualifierHierarchy.java:96) org.checkerframework.framework.type.AnnotatedTypeFactory.createQualifierHierarchy(AnnotatedTypeFactory.java:447) org.checkerframework.framework.type.AnnotatedTypeFactory.createQualifierHierarchy(AnnotatedTypeFactory.java:426) org.checkerframework.framework.type.AnnotatedTypeFactory.postInit(AnnotatedTypeFactory.java:323) org.checkerframework.framework.type.GenericAnnotatedTypeFactory.postInit(GenericAnnotatedTypeFactory.java:162) org.checkerframework.checker.nullness.KeyForAnnotatedTypeFactory.(KeyForAnnotatedTypeFactory.java:94) sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) java.lang.reflect.Constructor.newInstance(Constructor.java:422) org.checkerframework.common.basetype.BaseTypeChecker.invokeConstructorFor(BaseTypeChecker.java:270) org.checkerframework.common.basetype.BaseTypeVisitor.createTypeFactory(BaseTypeVisitor.java:244) org.checkerframework.common.basetype.BaseTypeVisitor.(BaseTypeVisitor.java:200) org.checkerframework.checker.nullness.KeyForVisitor.(KeyForVisitor.java:31) sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) java.lang.reflect.Constructor.newInstance(Constructor.java:422) org.checkerframework.common.basetype.BaseTypeChecker.invokeConstructorFor(BaseTypeChecker.java:270) org.checkerframework.common.basetype.BaseTypeChecker.createSourceVisitor(BaseTypeChecker.java:205) org.checkerframework.common.basetype.BaseTypeChecker.createSourceVisitor(BaseTypeChecker.java:99) org.checkerframework.framework.source.SourceChecker.initChecker(SourceChecker.java:792) org.checkerframework.common.basetype.BaseTypeChecker.initChecker(BaseTypeChecker.java:114) org.checkerframework.common.basetype.BaseTypeChecker.initChecker(BaseTypeChecker.java:105) org.checkerframework.framework.source.SourceChecker.typeProcessingStart(SourceChecker.java:753) org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:183) com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:707) com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:113) com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1303) com.google.errorprone.ErrorProneJavacJavaCompiler.flow(ErrorProneJavacJavaCompiler.java:95) com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1247) com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:858) com.sun.tools.javac.main.Main.compile(Main.java:253) com.google.errorprone.ErrorProneCompiler.run(ErrorProneCompiler.java:249) com.google.errorprone.ErrorProneCompiler.run(ErrorProneCompiler.java:159) com.google.errorprone.ErrorProneCompiler.compile(ErrorProneCompiler.java:88) org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne$CompilerInvoker.compile(JavacCompilerWithErrorProne.java:219) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:497) org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne.performCompile(JavacCompilerWithErrorProne.java:91) org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:825) org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:129) org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116) org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120) org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:355) org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155) org.apache.maven.cli.MavenCli.execute(MavenCli.java:584) org.apache.maven.cli.MavenCli.doMain(MavenCli.java:216) org.apache.maven.cli.MavenCli.main(MavenCli.java:160) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:497) org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) Underlying Exception: java.lang.ClassNotFoundException: org.checkerframework.framework.qual.PolymorphicQualifier; Stack trace: java.net.URLClassLoader.findClass(URLClassLoader.java:381) java.lang.ClassLoader.loadClass(ClassLoader.java:424) org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne$NonDelegatingClassLoader.loadClass(JavacCompilerWithErrorProne.java:134) java.lang.ClassLoader.loadClass(ClassLoader.java:357) java.lang.Class.forName0(Native Method) java.lang.Class.forName(Class.java:264) org.checkerframework.javacutil.AnnotationUtils.getElementValueClass(AnnotationUtils.java:511) org.checkerframework.framework.util.QualifierPolymorphism.getPolymorphicQualifierTop(QualifierPolymorphism.java:168) org.checkerframework.framework.util.MultiGraphQualifierHierarchy$MultiGraphFactory.addQualifier(MultiGraphQualifierHierarchy.java:96) org.checkerframework.framework.type.AnnotatedTypeFactory.createQualifierHierarchy(AnnotatedTypeFactory.java:447) org.checkerframework.framework.type.AnnotatedTypeFactory.createQualifierHierarchy(AnnotatedTypeFactory.java:426) org.checkerframework.framework.type.AnnotatedTypeFactory.postInit(AnnotatedTypeFactory.java:323) org.checkerframework.framework.type.GenericAnnotatedTypeFactory.postInit(GenericAnnotatedTypeFactory.java:162) org.checkerframework.checker.nullness.KeyForAnnotatedTypeFactory.(KeyForAnnotatedTypeFactory.java:94) sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) java.lang.reflect.Constructor.newInstance(Constructor.java:422) org.checkerframework.common.basetype.BaseTypeChecker.invokeConstructorFor(BaseTypeChecker.java:270) org.checkerframework.common.basetype.BaseTypeVisitor.createTypeFactory(BaseTypeVisitor.java:244) org.checkerframework.common.basetype.BaseTypeVisitor.(BaseTypeVisitor.java:200) org.checkerframework.checker.nullness.KeyForVisitor.(KeyForVisitor.java:31) sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) java.lang.reflect.Constructor.newInstance(Constructor.java:422) org.checkerframework.common.basetype.BaseTypeChecker.invokeConstructorFor(BaseTypeChecker.java:270) org.checkerframework.common.basetype.BaseTypeChecker.createSourceVisitor(BaseTypeChecker.java:205) org.checkerframework.common.basetype.BaseTypeChecker.createSourceVisitor(BaseTypeChecker.java:99) org.checkerframework.framework.source.SourceChecker.initChecker(SourceChecker.java:792) org.checkerframework.common.basetype.BaseTypeChecker.initChecker(BaseTypeChecker.java:114) org.checkerframework.common.basetype.BaseTypeChecker.initChecker(BaseTypeChecker.java:105) org.checkerframework.framework.source.SourceChecker.typeProcessingStart(SourceChecker.java:753) org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:183) com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:707) com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:113) com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1303) com.google.errorprone.ErrorProneJavacJavaCompiler.flow(ErrorProneJavacJavaCompiler.java:95) com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1247) com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:858) com.sun.tools.javac.main.Main.compile(Main.java:253) com.google.errorprone.ErrorProneCompiler.run(ErrorProneCompiler.java:249) com.google.errorprone.ErrorProneCompiler.run(ErrorProneCompiler.java:159) com.google.errorprone.ErrorProneCompiler.compile(ErrorProneCompiler.java:88) org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne$CompilerInvoker.compile(JavacCompilerWithErrorProne.java:219) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:497) org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne.performCompile(JavacCompilerWithErrorProne.java:91) org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:825) org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:129) org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116) org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120) org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:355) org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155) org.apache.maven.cli.MavenCli.execute(MavenCli.java:584) org.apache.maven.cli.MavenCli.doMain(MavenCli.java:216) org.apache.maven.cli.MavenCli.main(MavenCli.java:160) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:497) org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) 1 error

So I added checker libraries into maven-compiler-plugin's dependencies, now it throws exception: org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile (default-compile) on project code-quality-simple: Fatal error compiling at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:216) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:355) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155) at org.apache.maven.cli.MavenCli.execute(MavenCli.java:584) at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:216) at org.apache.maven.cli.MavenCli.main(MavenCli.java:160) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) Caused by: org.apache.maven.plugin.MojoExecutionException: Fatal error compiling at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:836) at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:129) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) ... 19 more Caused by: org.codehaus.plexus.compiler.CompilerException: Prohibited package name: java.lang at org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne.performCompile(JavacCompilerWithErrorProne.java:95) at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:825) ... 22 more Caused by: org.codehaus.plexus.compiler.CompilerException: Prohibited package name: java.lang at org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne.getInvoker(JavacCompilerWithErrorProne.java:157) at org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne.performCompile(JavacCompilerWithErrorProne.java:91) ... 23 more Caused by: java.lang.SecurityException: Prohibited package name: java.lang at java.lang.ClassLoader.preDefineClass(ClassLoader.java:659) at java.lang.ClassLoader.defineClass(ClassLoader.java:758) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) at java.net.URLClassLoader.access$100(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:368) at java.net.URLClassLoader$1.run(URLClassLoader.java:362) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:361) at org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne$NonDelegatingClassLoader.loadClass(JavacCompilerWithErrorProne.java:129) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:760) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) at java.net.URLClassLoader.access$100(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:368) at java.net.URLClassLoader$1.run(URLClassLoader.java:362) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:361) at org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne$NonDelegatingClassLoader.loadClass(JavacCompilerWithErrorProne.java:129) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne.getInvoker(JavacCompilerWithErrorProne.java:152) ... 24 more

The whole configuration:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.3</version>
      <configuration>
        <source>${jdk.source}</source>
        <target>${jdk.target}</target>
        <failOnError>false</failOnError>
        <compilerId>javac-with-errorprone</compilerId>
        <forceJavacCompilerUse>true</forceJavacCompilerUse>
        <fork>true</fork>
        <!-- Add all the checkers you want to enable here -->
        <annotationProcessors>
       <annotationProcessor>org.checkerframework.checker.nullness.NullnessChecker</annotationProcessor>
        </annotationProcessors>
        <compilerArgs>
          <!-- location of the annotated JDK, which comes from a Maven dependency -->
          <arg>-Xbootclasspath/p:${annotatedJdk}</arg>
          <!-- Uncomment the following line if using Java 7. -->
          <arg>-J-Xbootclasspath/p:${typeAnnotationsJavac}</arg>
          <arg>-Alint</arg>
          <arg>-AprintErrorStack</arg>
          <arg>-XDTA:spacesincomments</arg>
        </compilerArgs>

      </configuration>
      <dependencies>
        <dependency>
          <groupId>org.codehaus.plexus</groupId>
          <artifactId>plexus-compiler-javac-errorprone</artifactId>
          <version>2.5</version>
        </dependency>
        <!-- override plexus-compiler-javac-errorprone's dependency on Error 
          Prone with the latest version -->
        <dependency>
          <groupId>com.google.errorprone</groupId>
          <artifactId>error_prone_core</artifactId>
          <version>2.0.7</version>
        </dependency>

        <!-- this makes no difference -->
        <dependency>
          <groupId>org.checkerframework</groupId>
          <artifactId>checker-qual</artifactId>
          <version>${checker.version}</version>
        </dependency>
        <dependency>
          <groupId>org.checkerframework</groupId>
          <artifactId>checker</artifactId>
          <version>${checker.version}</version>
        </dependency>
        <dependency>
          <groupId>org.checkerframework</groupId>
          <artifactId>jdk8</artifactId>
          <version>${checker.version}</version>
        </dependency>
      </dependencies>
    </plugin>

Or online version : https://github.com/jefferyyuan/code-quality-mvn/blob/master/code-quality-simple/pom.xml

atomicknight commented 8 years ago

Just to follow up on the plexus-compiler-javac issue noted previously: the issue can be avoided by not forking a separate process for compilation (i.e. remove <fork>true</fork> from the configuration above).

However, this will not address the issue if a JDK toolchain is used or if a compiler other than plexus-compiler-javac is used.

mernst commented 7 years ago

There are new instructions for how to work with Maven, so I think this can be closed. If that's not the case, please let us know.