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 5dccd00c..b2e89adb 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 @@ -174,7 +174,7 @@ protected static class Messages { }; // javac.properties-> javac.msg.resource - // (en JDK-8, ja JDK-8, zh_CN JDK-8, en JDK-21, ja JDK-21, zh_CN JDK-21, de JDK-21) + // (en JDK-8, ja JDK-8, zh_CN JDK-8, en JDK-21, ja JDK-21, zh_CN JDK-21, de JDK-21) protected static final String[] SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS = { "\n\nThe system is out of resources.\nConsult the following stack trace for details.\n", "\n\nシステム・リソースが不足しています。\n詳細は次のスタック・トレースで調査してください。\n", @@ -186,7 +186,7 @@ protected static class Messages { }; // javac.properties-> javac.msg.io - // (en JDK-8, ja JDK-8, zh_CN JDK-8, en JDK-21, ja JDK-21, zh_CN JDK-21, de JDK-21) + // (en JDK-8, ja JDK-8, zh_CN JDK-8, en JDK-21, ja JDK-21, zh_CN JDK-21, de JDK-21) protected static final String[] IO_ERROR_HEADERS = { "\n\nAn input/output error occurred.\nConsult the following stack trace for details.\n", "\n\n入出力エラーが発生しました。\n詳細は次のスタック・トレースで調査してください。\n", @@ -197,6 +197,18 @@ protected static class Messages { "\n\nEin Eingabe-/Ausgabefehler ist aufgetreten.\nDetails finden Sie im folgenden Stacktrace.\n" }; + // javac.properties-> javac.msg.plugin.uncaught.exception + // (en JDK-8, ja JDK-8, zh_CN JDK-8, en JDK-21, ja JDK-21, zh_CN JDK-21, de JDK-21) + protected static final String[] PLUGIN_ERROR_HEADERS = { + "\n\nA plugin threw an uncaught exception.\nConsult the following stack trace for details.\n", + "\n\nプラグインで捕捉されない例外がスローされました。\n詳細は次のスタック・トレースで調査してください。\n", + "\n\n插件抛出未捕获的异常错误。\n有关详细信息, 请参阅以下堆栈跟踪。\n", + "\n\nA plugin threw an uncaught exception.\nConsult the following stack trace for details.\n", + "\n\nプラグインで捕捉されない例外がスローされました。\n詳細は次のスタック・トレースで調査してください。\n", + "\n\n插件抛出未捕获的异常错误。\n有关详细信息, 请参阅以下堆栈跟踪。\n", + "\n\nEin Plug-in hat eine nicht abgefangene Ausnahme ausgel\u00F6st.\nDetails finden Sie im folgenden Stacktrace.\n" + }; + } private static final Object LOCK = new Object(); @@ -782,7 +794,8 @@ static List parseModernStream(int exitCode, BufferedReader inpu || (cleanedUpMessage = getFileABugError(bufferContent)) != null || (cleanedUpMessage = getAnnotationProcessingError(bufferContent)) != null || (cleanedUpMessage = getSystemOutOfResourcesError(bufferContent)) != null - || (cleanedUpMessage = getIOError(bufferContent)) != null) { + || (cleanedUpMessage = getIOError(bufferContent)) != null + || (cleanedUpMessage = getPluginError(bufferContent)) != null) { errors.add(new CompilerMessage(cleanedUpMessage, ERROR)); } else if (hasPointer) { // A compiler message remains in buffer at end of parse stream @@ -851,6 +864,10 @@ private static String getIOError(String message) { return getTextStartingWithPrefix(message, IO_ERROR_HEADERS); } + private static String getPluginError(String message) { + return getTextStartingWithPrefix(message, PLUGIN_ERROR_HEADERS); + } + private static boolean startsWithPrefix(String text, String[] prefixes) { for (String prefix : prefixes) { if (text.startsWith(prefix)) { diff --git a/plexus-compilers/plexus-compiler-javac/src/test/java/org/codehaus/plexus/compiler/javac/ErrorMessageParserTest.java b/plexus-compilers/plexus-compiler-javac/src/test/java/org/codehaus/plexus/compiler/javac/ErrorMessageParserTest.java index db8ea358..2d2812d2 100644 --- a/plexus-compilers/plexus-compiler-javac/src/test/java/org/codehaus/plexus/compiler/javac/ErrorMessageParserTest.java +++ b/plexus-compilers/plexus-compiler-javac/src/test/java/org/codehaus/plexus/compiler/javac/ErrorMessageParserTest.java @@ -977,6 +977,47 @@ private static Stream testIOError_args() { Arguments.of("JDK 21 German", IO_ERROR_HEADERS[6])); } + @ParameterizedTest(name = "{0}") + @MethodSource("testPluginError_args") + public void testPluginError(String jdkAndLocale, String stackTraceHeader) throws Exception { + String stackTraceWithHeader = UNIDENTIFIED_LOG_LINES + stackTraceHeader + stackTracePluginError; + + List compilerMessages = + JavacCompiler.parseModernStream(4, new BufferedReader(new StringReader(stackTraceWithHeader))); + + assertThat(compilerMessages, notNullValue()); + assertThat(compilerMessages, hasSize(1)); + + String message = compilerMessages.get(0).getMessage().replaceAll(EOL, "\n"); + // Parser retains stack trace header + assertThat(message, startsWith(stackTraceHeader)); + assertThat(message, endsWith(stackTracePluginError)); + } + + private static final String stackTracePluginError = + "A plugin threw an uncaught exception.\n" + + "Consult the following stack trace for details.\n" + + "java.lang.NoSuchMethodError: com.sun.tools.javac.util.JavacMessages.add(Lcom/sun/tools/javac/util/JavacMessages$ResourceBundleHelper;)V\n" + + "\tat com.google.errorprone.BaseErrorProneJavaCompiler.setupMessageBundle(BaseErrorProneJavaCompiler.java:202)\n" + + "\tat com.google.errorprone.ErrorProneJavacPlugin.init(ErrorProneJavacPlugin.java:40)\n" + + "\tat com.sun.tools.javac.main.Main.compile(Main.java:470)\n" + + "\tat com.sun.tools.javac.main.Main.compile(Main.java:381)\n" + + "\tat com.sun.tools.javac.main.Main.compile(Main.java:370)\n" + + "\tat com.sun.tools.javac.main.Main.compile(Main.java:361)\n" + + "\tat com.sun.tools.javac.Main.compile(Main.java:56)\n" + + "\tat com.sun.tools.javac.Main.main(Main.java:42)\n"; + + private static Stream testPluginError_args() { + return Stream.of( + Arguments.of("JDK 8 English", PLUGIN_ERROR_HEADERS[0]), + Arguments.of("JDK 8 Japanese", PLUGIN_ERROR_HEADERS[1]), + Arguments.of("JDK 8 Chinese", PLUGIN_ERROR_HEADERS[2]), + Arguments.of("JDK 21 English", PLUGIN_ERROR_HEADERS[3]), + Arguments.of("JDK 21 Japanese", PLUGIN_ERROR_HEADERS[4]), + Arguments.of("JDK 21 Chinese", PLUGIN_ERROR_HEADERS[5]), + Arguments.of("JDK 21 German", PLUGIN_ERROR_HEADERS[6])); + } + @Test public void testNonAnchoredWarning() throws IOException { final String error = "warning: [options] bootstrap class path not set in conjunction with -source 1.6" + EOL