diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/pom.xml b/plexus-compilers/plexus-compiler-javac-errorprone/pom.xml
index 1fa91ade..ec6c1767 100644
--- a/plexus-compilers/plexus-compiler-javac-errorprone/pom.xml
+++ b/plexus-compilers/plexus-compiler-javac-errorprone/pom.xml
@@ -29,24 +29,8 @@
com.google.errorprone
error_prone_core
- 2.3.4
+ 2.4.0
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- true
-
-
-
-
-
diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/main/java/org/codehaus/plexus/compiler/javac/errorprone/JavacCompilerWithErrorProne.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/main/java/org/codehaus/plexus/compiler/javac/errorprone/JavacCompilerWithErrorProne.java
index a840b6f5..f9a05951 100644
--- a/plexus-compilers/plexus-compiler-javac-errorprone/src/main/java/org/codehaus/plexus/compiler/javac/errorprone/JavacCompilerWithErrorProne.java
+++ b/plexus-compilers/plexus-compiler-javac-errorprone/src/main/java/org/codehaus/plexus/compiler/javac/errorprone/JavacCompilerWithErrorProne.java
@@ -16,26 +16,22 @@
package org.codehaus.plexus.compiler.javac.errorprone;
-import com.google.errorprone.ErrorProneCompiler;
-import org.codehaus.plexus.compiler.AbstractCompiler;
+import com.google.errorprone.ErrorProneJavaCompiler;
+
import org.codehaus.plexus.compiler.CompilerConfiguration;
import org.codehaus.plexus.compiler.CompilerException;
import org.codehaus.plexus.compiler.CompilerMessage;
-import org.codehaus.plexus.compiler.CompilerOutputStyle;
import org.codehaus.plexus.compiler.CompilerResult;
+import org.codehaus.plexus.compiler.javac.InProcessCompiler;
import org.codehaus.plexus.compiler.javac.JavacCompiler;
+import org.codehaus.plexus.compiler.javac.JavaxToolsCompiler;
+
+import javax.tools.JavaCompiler;
+import javax.tools.ToolProvider;
-import javax.tools.Diagnostic;
-import javax.tools.DiagnosticListener;
-import javax.tools.JavaFileObject;
-import java.io.File;
-import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
/**
* This class overrides JavacCompiler with modifications to use the error-prone
@@ -45,58 +41,8 @@
* @plexus.component role="org.codehaus.plexus.compiler.Compiler" role-hint="javac-with-errorprone"
*/
public class JavacCompilerWithErrorProne
- extends AbstractCompiler
+ extends JavacCompiler
{
- public JavacCompilerWithErrorProne()
- {
- super( CompilerOutputStyle.ONE_OUTPUT_FILE_PER_INPUT_FILE, ".java", ".class", null );
- }
-
- public String[] createCommandLine( CompilerConfiguration config )
- throws CompilerException
- {
- return new String[0];
- }
-
- @Override
- public CompilerResult performCompile( CompilerConfiguration config )
- throws CompilerException
- {
- File destinationDir = new File( config.getOutputLocation() );
-
- if ( !destinationDir.exists() )
- {
- destinationDir.mkdirs();
- }
-
- String[] sourceFiles = getSourceFiles( config );
-
- if ( ( sourceFiles == null ) || ( sourceFiles.length == 0 ) )
- {
- return new CompilerResult();
- }
-
- if ( ( getLogger() != null ) && getLogger().isInfoEnabled() )
- {
- getLogger().info( "Compiling " + sourceFiles.length + " " //
- + "source file" //
- + ( sourceFiles.length == 1 ? "" : "s" ) //
- + " to " + destinationDir.getAbsolutePath() );
- }
-
- String[] args = JavacCompiler.buildCompilerArguments( config, sourceFiles );
-
- try
- {
- CompilerResult compilerResult = (CompilerResult) getInvoker().invoke( null, new Object[]{ args } );
- return compilerResult;
- }
- catch ( Exception e )
- {
- throw new CompilerException( e.getMessage(), e );
- }
- }
-
private static class NonDelegatingClassLoader
extends URLClassLoader
{
@@ -115,6 +61,10 @@ public Class> loadClass( String name, boolean complete )
{
// Classes loaded inside CompilerInvoker that need to reach back to the caller
if ( name.contentEquals( CompilerResult.class.getName() )
+ || name.contentEquals( InProcessCompiler.class.getName() )
+ || name.contentEquals( CompilerConfiguration.class.getName() )
+ || name.contentEquals( CompilerConfiguration.CompilerReuseStrategy.class.getName() )
+ || name.contentEquals( CompilerException.class.getName() )
|| name.contentEquals( CompilerMessage.class.getName() )
|| name.contentEquals( CompilerMessage.Kind.class.getName() ) )
{
@@ -140,12 +90,9 @@ public Class> loadClass( String name, boolean complete )
}
}
- private Method invokerMethod;
-
- private Method getInvoker()
- throws CompilerException
+ protected InProcessCompiler inProcessCompiler()
{
- if ( invokerMethod == null )
+ if ( Thread.currentThread().getContextClassLoader().getResource("java/lang/module/ModuleReference.class") == null )
{
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
URL[] urls = ( (URLClassLoader) contextClassLoader ).getURLs();
@@ -154,14 +101,14 @@ private Method getInvoker()
{
loader = new NonDelegatingClassLoader( urls, contextClassLoader );
Class> clazz = Class.forName( CompilerInvoker.class.getName(), true, loader );
- invokerMethod = clazz.getMethod( "compile", String[].class );
+ return ( InProcessCompiler ) clazz.newInstance();
}
catch ( Exception e )
{
- throw new CompilerException( e.getMessage(), e );
+ throw new IllegalStateException( e );
}
}
- return invokerMethod;
+ return new CompilerInvoker();
}
/**
@@ -170,57 +117,12 @@ private Method getInvoker()
* javac.jar instead of from the bootclasspath.
*/
public static class CompilerInvoker
+ extends JavaxToolsCompiler
{
- private static class MessageListener
- implements DiagnosticListener
- {
- private final List messages;
-
- MessageListener( List messages )
- {
- this.messages = messages;
- }
-
- public static CompilerMessage.Kind convertKind( Diagnostic extends JavaFileObject> diagnostic )
- {
- switch ( diagnostic.getKind() )
- {
- case ERROR:
- return CompilerMessage.Kind.ERROR;
- case WARNING:
- return CompilerMessage.Kind.WARNING;
- case MANDATORY_WARNING:
- return CompilerMessage.Kind.MANDATORY_WARNING;
- case NOTE:
- return CompilerMessage.Kind.NOTE;
- default:
- return CompilerMessage.Kind.OTHER;
- }
- }
-
- public void report( Diagnostic extends JavaFileObject> diagnostic )
- {
- CompilerMessage compilerMessage =
- new CompilerMessage( diagnostic.getSource() == null ? null : diagnostic.getSource().getName(), //
- convertKind( diagnostic ), //
- (int) diagnostic.getLineNumber(), //
- (int) diagnostic.getColumnNumber(), //
- -1, //
- -1,
- // end pos line:column is hard to calculate
- diagnostic.getMessage( Locale.getDefault() ) );
- messages.add( compilerMessage );
- }
- }
-
- public static CompilerResult compile( String[] args )
- {
- List messages = new ArrayList<>();
- ErrorProneCompiler compiler = //
- ErrorProneCompiler.builder() //
- .listenToDiagnostics( new MessageListener( messages ) ) //
- .build();
- return new CompilerResult( compiler.run( args ).isOK(), messages );
- }
+ @Override
+ protected JavaCompiler newJavaCompiler()
+ {
+ return new ErrorProneJavaCompiler();
+ }
}
}
\ No newline at end of file
diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/ShortSet.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/ShortSet.java
new file mode 100644
index 00000000..405b34be
--- /dev/null
+++ b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/ShortSet.java
@@ -0,0 +1,13 @@
+import java.util.Set;
+import java.util.HashSet;
+
+public class ShortSet {
+ public static void main (String[] args) {
+ Set s = new HashSet<>();
+ for (short i = 0; i < 100; i++) {
+ s.add(i);
+ s.remove(i - 1);
+ }
+ System.out.println(s.size());
+ }
+}
\ No newline at end of file
diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Bad.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Bad.java
deleted file mode 100644
index b450e4f7..00000000
--- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Bad.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.codehaus.foo;
-
-public class Bad
-{
- // Intentionally misspelled modifier.
- pubic String name;
-}
diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Deprecation.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Deprecation.java
deleted file mode 100644
index e2619472..00000000
--- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Deprecation.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.codehaus.foo;
-
-public class Deprecation
-{
- public Deprecation()
- {
- new java.util.Date("testDate");
- }
-}
diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/ExternalDeps.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/ExternalDeps.java
deleted file mode 100644
index 30ce7bc1..00000000
--- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/ExternalDeps.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.codehaus.foo;
-
-import org.apache.commons.lang.StringUtils;
-
-public class ExternalDeps
-{
- public void hello( String str )
- {
- System.out.println( StringUtils.upperCase( str) );
- }
-}
diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Person.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Person.java
deleted file mode 100644
index 0b58d0ee..00000000
--- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Person.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.codehaus.foo;
-
-public class Person
-{
-}
diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/ReservedWord.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/ReservedWord.java
deleted file mode 100644
index 3f8434fd..00000000
--- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/ReservedWord.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package org.codehaus.foo;
-
-public class ReservedWord
-{
- String assert;
-}
diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/UnknownSymbol.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/UnknownSymbol.java
deleted file mode 100644
index d8b752e9..00000000
--- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/UnknownSymbol.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.codehaus.foo;
-
-public class UnknownSymbol
-{
- public UnknownSymbol()
- {
- foo();
- }
-}
diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/WrongClassname.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/WrongClassname.java
deleted file mode 100644
index 1c4107f8..00000000
--- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/WrongClassname.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.codehaus.foo;
-
-public class RightClassname
-{
-}
diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test/java/org/codehaus/plexus/compiler/javac/JavacErrorProneCompilerTest.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test/java/org/codehaus/plexus/compiler/javac/JavacErrorProneCompilerTest.java
index 55264dba..babdc696 100644
--- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test/java/org/codehaus/plexus/compiler/javac/JavacErrorProneCompilerTest.java
+++ b/plexus-compilers/plexus-compiler-javac-errorprone/src/test/java/org/codehaus/plexus/compiler/javac/JavacErrorProneCompilerTest.java
@@ -24,17 +24,14 @@
* SOFTWARE.
*/
+import org.codehaus.classworlds.DefaultClassRealm;
import org.codehaus.plexus.compiler.AbstractCompilerTest;
-import org.codehaus.plexus.compiler.CompilerConfiguration;
-import org.codehaus.plexus.util.StringUtils;
-import java.io.File;
-import java.util.ArrayList;
+import java.lang.reflect.Field;
+import java.net.URLClassLoader;
import java.util.Arrays;
import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.Collections;
/**
* @author Jason van Zyl
@@ -43,31 +40,69 @@ public class JavacErrorProneCompilerTest
extends AbstractCompilerTest
{
+ protected boolean java8() {
+ return System.getProperty( "java.version" ).startsWith( "1.8" );
+ }
+
+ private ClassLoader originalTCCL;
+
public void setUp()
throws Exception
{
super.setUp();
- setForceJavacCompilerUse( true );
+ if ( java8() ) {
+ ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+ this.originalTCCL = contextClassLoader;
+ Field realmField = contextClassLoader.getClass().getDeclaredField("realm");
+ realmField.setAccessible(true);
+ DefaultClassRealm realm = (DefaultClassRealm) realmField.get(contextClassLoader);
+ Field foreignClassLoaderField = realm.getClass().getDeclaredField("foreignClassLoader");
+ foreignClassLoaderField.setAccessible(true);
+ URLClassLoader foreignClassLoader = (URLClassLoader) foreignClassLoaderField.get(realm);
+ Thread.currentThread().setContextClassLoader(foreignClassLoader);
+ }
+ }
+
+ public void tearDown()
+ throws Exception
+ {
+ if ( java8() ) {
+ Thread.currentThread().setContextClassLoader(originalTCCL);
+ }
+ super.tearDown();
}
protected String getRoleHint()
{
return "javac-with-errorprone";
}
+
protected int expectedWarnings()
{
- return 10;
+ if ( java8() ) {
+ return 1;
+ }
+ else
+ {
+ return 2;
+ }
}
@Override
protected int expectedErrors()
{
- return 4;
+ return 1;
}
- protected Collection expectedOutputFiles()
+ @Override
+ public String getSourceVersion()
+ {
+ return "1.8";
+ }
+
+ @Override
+ public String getTargetVersion()
{
- return Arrays.asList( new String[]{ "org/codehaus/foo/Deprecation.class", "org/codehaus/foo/ExternalDeps.class",
- "org/codehaus/foo/Person.class", "org/codehaus/foo/ReservedWord.class" } );
+ return "1.8";
}
}
diff --git a/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/InProcessCompiler.java b/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/InProcessCompiler.java
new file mode 100644
index 00000000..c4374eee
--- /dev/null
+++ b/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/InProcessCompiler.java
@@ -0,0 +1,12 @@
+package org.codehaus.plexus.compiler.javac;
+
+import org.codehaus.plexus.compiler.CompilerConfiguration;
+import org.codehaus.plexus.compiler.CompilerException;
+import org.codehaus.plexus.compiler.CompilerResult;
+
+public interface InProcessCompiler {
+
+ CompilerResult compileInProcess(String[] args, final CompilerConfiguration config, String[] sourceFiles)
+ throws CompilerException;
+
+}
diff --git a/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java b/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java
index 8f92a64c..d215d0a3 100644
--- a/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java
+++ b/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java
@@ -173,7 +173,7 @@ public CompilerResult performCompile( CompilerConfiguration config )
{
// use fqcn to prevent loading of the class on 1.5 environment !
result =
- org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess( args, config, sourceFiles );
+ inProcessCompiler().compileInProcess( args, config, sourceFiles );
}
else
{
@@ -184,6 +184,11 @@ public CompilerResult performCompile( CompilerConfiguration config )
return result;
}
+ protected InProcessCompiler inProcessCompiler()
+ {
+ return new org.codehaus.plexus.compiler.javac.JavaxToolsCompiler();
+ }
+
protected static boolean isJava16()
{
try
diff --git a/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavaxToolsCompiler.java b/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavaxToolsCompiler.java
index 85b048bc..7eaa3ab0 100644
--- a/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavaxToolsCompiler.java
+++ b/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavaxToolsCompiler.java
@@ -41,22 +41,27 @@
* @author David M. Lloyd
* @since 2.0
*/
-public class JavaxToolsCompiler
+public class JavaxToolsCompiler implements InProcessCompiler
{
/**
* is that thread safe ???
*/
@SuppressWarnings( "restriction" )
- static final JavaCompiler COMPILER = ToolProvider.getSystemJavaCompiler();
+ private final JavaCompiler COMPILER = newJavaCompiler();
- private static List JAVA_COMPILERS = new CopyOnWriteArrayList<>();
+ protected JavaCompiler newJavaCompiler()
+ {
+ return ToolProvider.getSystemJavaCompiler();
+ }
- protected static JavaCompiler getJavaCompiler( CompilerConfiguration compilerConfiguration )
+ private List JAVA_COMPILERS = new CopyOnWriteArrayList<>();
+
+ private JavaCompiler getJavaCompiler( CompilerConfiguration compilerConfiguration )
{
switch ( compilerConfiguration.getCompilerReuseStrategy() )
{
case AlwaysNew:
- return ToolProvider.getSystemJavaCompiler();
+ return newJavaCompiler();
case ReuseCreated:
JavaCompiler javaCompiler;
synchronized ( JAVA_COMPILERS )
@@ -68,7 +73,7 @@ protected static JavaCompiler getJavaCompiler( CompilerConfiguration compilerCon
return javaCompiler;
}
}
- javaCompiler = ToolProvider.getSystemJavaCompiler();
+ javaCompiler = newJavaCompiler();
return javaCompiler;
case ReuseSame:
default:
@@ -77,7 +82,7 @@ protected static JavaCompiler getJavaCompiler( CompilerConfiguration compilerCon
}
- static void releaseJavaCompiler( JavaCompiler javaCompiler, CompilerConfiguration compilerConfiguration )
+ private void releaseJavaCompiler( JavaCompiler javaCompiler, CompilerConfiguration compilerConfiguration )
{
if ( javaCompiler == null )
{
@@ -90,7 +95,7 @@ static void releaseJavaCompiler( JavaCompiler javaCompiler, CompilerConfiguratio
}
}
- static CompilerResult compileInProcess( String[] args, final CompilerConfiguration config, String[] sourceFiles )
+ public CompilerResult compileInProcess( String[] args, final CompilerConfiguration config, String[] sourceFiles )
throws CompilerException
{
JavaCompiler compiler = getJavaCompiler( config );
@@ -179,7 +184,7 @@ static CompilerResult compileInProcess( String[] args, final CompilerConfigurati
}
}
- public static CompilerMessage.Kind convertKind(Diagnostic extends JavaFileObject> diagnostic) {
+ private CompilerMessage.Kind convertKind(Diagnostic extends JavaFileObject> diagnostic) {
CompilerMessage.Kind kind;
switch ( diagnostic.getKind() )
{