|
11 | 11 | import java.io.File; |
12 | 12 | import java.io.StringWriter; |
13 | 13 | import java.util.Arrays; |
| 14 | +import java.util.List; |
14 | 15 |
|
15 | 16 | public class CompilerUtil { |
16 | 17 | protected static final File DESTINATION_DIRECTORY = new File("build/test-recompiled"); |
17 | 18 | protected static final String DESTINATION_DIRECTORY_PATH = DESTINATION_DIRECTORY.getAbsolutePath(); |
18 | 19 |
|
19 | | - public static boolean compile(String javaVersion, JavaFileObject... JavaFileObjects) throws Exception { |
| 20 | + public static boolean compile(String preferredJavaVersion, JavaFileObject... javaFileObjects) throws Exception { |
20 | 21 | boolean compilationSuccess = false; |
| 22 | + String javaVersion = getJavaVersion(preferredJavaVersion); |
21 | 23 |
|
22 | 24 | DESTINATION_DIRECTORY.mkdirs(); |
23 | 25 |
|
24 | 26 | JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); |
25 | 27 | StringWriter writer = new StringWriter(); |
26 | 28 | DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>(); |
| 29 | + List<String> options = Arrays.asList("-source", javaVersion, "-target", javaVersion, "-d", DESTINATION_DIRECTORY_PATH, "-cp", System.getProperty("java.class.path")); |
| 30 | + List<JavaFileObject> compilationUnits = Arrays.asList(javaFileObjects); |
27 | 31 |
|
28 | 32 | try (StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null)) { |
29 | | - Iterable<String> options = Arrays.asList("-source", javaVersion, "-target", javaVersion, "-d", DESTINATION_DIRECTORY_PATH); |
30 | | - Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(JavaFileObjects); |
31 | 33 | compilationSuccess = compiler.getTask(writer, fileManager, diagnostics, options, null, compilationUnits).call(); |
32 | 34 |
|
33 | | - for (Diagnostic d : diagnostics.getDiagnostics()) { |
34 | | - if (d.getLineNumber() > 0) { |
35 | | - System.err.print(String.format("%-7s - line %-4d- %s%n", d.getKind(), d.getLineNumber(), d.getMessage(null))); |
36 | | - } else { |
37 | | - System.err.print(String.format("%-7s - - %s%n", d.getKind(), d.getMessage(null))); |
| 35 | + if (!diagnostics.getDiagnostics().isEmpty()) { |
| 36 | + StringBuilder sb = new StringBuilder(); |
| 37 | + |
| 38 | + for (Diagnostic d : diagnostics.getDiagnostics()) { |
| 39 | + switch (d.getKind()) { |
| 40 | + case NOTE: |
| 41 | + case WARNING: |
| 42 | + break; |
| 43 | + default: |
| 44 | + if (d.getLineNumber() > 0) { |
| 45 | + sb.append(String.format("%-7s - line %-4d- %s%n", d.getKind(), d.getLineNumber(), d.getMessage(null))); |
| 46 | + } else { |
| 47 | + sb.append(String.format("%-7s - - %s%n", d.getKind(), d.getMessage(null))); |
| 48 | + } |
| 49 | + break; |
| 50 | + } |
| 51 | + } |
| 52 | + |
| 53 | + if (sb.length() > 0) { |
| 54 | + System.err.println(compilationUnits.get(0).getName()); |
| 55 | + System.err.print(sb.toString()); |
38 | 56 | } |
39 | 57 | } |
40 | 58 | } |
41 | 59 |
|
42 | 60 | return compilationSuccess; |
43 | 61 | } |
| 62 | + |
| 63 | + private static String getJavaVersion(String preferredJavaVersion) { |
| 64 | + int numericSystemJavaVersion = parseJavaVersion(System.getProperty("java.version")); |
| 65 | + |
| 66 | + if (numericSystemJavaVersion <= 8) { |
| 67 | + return preferredJavaVersion; |
| 68 | + } else { |
| 69 | + int numericPreferredJavaVersion = parseJavaVersion(preferredJavaVersion); |
| 70 | + |
| 71 | + if (numericPreferredJavaVersion < 6) { |
| 72 | + return "1.6"; |
| 73 | + } else { |
| 74 | + return preferredJavaVersion; |
| 75 | + } |
| 76 | + } |
| 77 | + } |
| 78 | + |
| 79 | + private static int parseJavaVersion(String javaVersion) { |
| 80 | + if(javaVersion.startsWith("1.")) { |
| 81 | + javaVersion = javaVersion.substring(2, 3); |
| 82 | + } else { |
| 83 | + int index = javaVersion.indexOf("."); |
| 84 | + |
| 85 | + if(index != -1) { |
| 86 | + javaVersion = javaVersion.substring(0, index); |
| 87 | + } |
| 88 | + } |
| 89 | + |
| 90 | + return Integer.parseInt(javaVersion); |
| 91 | + } |
44 | 92 | } |
0 commit comments