Skip to content

Commit a1ad21d

Browse files
kriegaexslachiewicz
authored andcommitted
Recognise javac.msg.resource error header
"The system is out of resources. Consult the following stack trace for details."
1 parent ddf4508 commit a1ad21d

File tree

2 files changed

+72
-2
lines changed

2 files changed

+72
-2
lines changed

plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,18 @@ protected static class Messages {
175175
"编译器 ({0}) 中出现异常错误。如果在 Bug Database (https://bugs.java.com) 中没有找到有关该错误的 Java 编译器 Bug,请通过 Java Bug 报告页 (https://bugreport.java.com) 提交 Java 编译器 Bug。请在报告中附上您的程序、以下诊断信息以及传递到 Java 编译器的参数。谢谢。\n",
176176
"Im Compiler ({0}) ist eine Ausnahme aufgetreten. Erstellen Sie auf der Java-Seite zum Melden von Bugs (https://bugreport.java.com) einen Bugbericht, nachdem Sie die Bugdatenbank (https://bugs.java.com) auf Duplikate geprüft haben. Geben Sie in Ihrem Bericht Ihr Programm, die folgende Diagnose und die Parameter an, die Sie dem Java-Compiler übergeben haben. Vielen Dank.\n"
177177
};
178+
179+
// javac.properties-> javac.msg.resource
180+
// (en JDK-8, ja JDK-8, zh_CN JDK-8, en JDK-21, ja JDK-21, zh_CN JDK-21, de JDK-21)
181+
protected static final String[] SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS = {
182+
"\n\nThe system is out of resources.\nConsult the following stack trace for details.\n",
183+
"\n\nシステム・リソースが不足しています。\n詳細は次のスタック・トレースで調査してください。\n",
184+
"\n\n系统资源不足。\n有关详细信息, 请参阅以下堆栈跟踪。\n",
185+
"\n\nThe system is out of resources.\nConsult the following stack trace for details.\n",
186+
"\n\nシステム・リソースが不足しています。\n詳細は次のスタックトレースで調査してください。\n",
187+
"\n\n系统资源不足。\n有关详细信息, 请参阅以下堆栈跟踪。\n",
188+
"\n\nDas System hat keine Ressourcen mehr.\nDetails finden Sie im folgenden Stacktrace.\n"
189+
};
178190
}
179191

180192
private static final Object LOCK = new Object();
@@ -742,7 +754,8 @@ static List<CompilerMessage> parseModernStream(int exitCode, BufferedReader inpu
742754
|| (cleanedUpMessage = getBootLayerInitError(bufferContent)) != null
743755
|| (cleanedUpMessage = getVMInitError(bufferContent)) != null
744756
|| (cleanedUpMessage = getFileABugError(bufferContent)) != null
745-
|| (cleanedUpMessage = getAnnotationProcessingError(bufferContent)) != null) {
757+
|| (cleanedUpMessage = getAnnotationProcessingError(bufferContent)) != null
758+
|| (cleanedUpMessage = getSystemOutOfResourcesError(bufferContent)) != null) {
746759
errors.add(new CompilerMessage(cleanedUpMessage, ERROR));
747760
} else if (hasPointer) {
748761
// A compiler message remains in buffer at end of parse stream
@@ -803,6 +816,10 @@ private static String getAnnotationProcessingError(String message) {
803816
return getTextStartingWithPrefix(message, ANNOTATION_PROCESSING_ERROR_HEADERS);
804817
}
805818

819+
private static String getSystemOutOfResourcesError(String message) {
820+
return getTextStartingWithPrefix(message, SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS);
821+
}
822+
806823
private static boolean startsWithPrefix(String text, String[] prefixes) {
807824
for (String prefix : prefixes) {
808825
if (text.startsWith(prefix)) {

plexus-compilers/plexus-compiler-javac/src/test/java/org/codehaus/plexus/compiler/javac/ErrorMessageParserTest.java

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -808,7 +808,10 @@ private static Stream<Arguments> testStackTraceWithUnknownHeader_args() {
808808
FILE_A_BUG_ERROR_HEADERS[0].replaceAll("\\{0\\}", "21").replaceAll("bug", "beetle")),
809809
Arguments.of(
810810
"modified annotation processor error header",
811-
ANNOTATION_PROCESSING_ERROR_HEADERS[0].replaceAll("uncaught", "undandled")));
811+
ANNOTATION_PROCESSING_ERROR_HEADERS[0].replaceAll("uncaught", "undandled")),
812+
Arguments.of(
813+
"modified out of resources error header",
814+
SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[0].replaceAll("resources", "memory")));
812815
}
813816

814817
@ParameterizedTest(name = "{0}")
@@ -876,6 +879,56 @@ private static Stream<Arguments> testBugParade_args() {
876879
Arguments.of("JDK 21 German", FILE_A_BUG_ERROR_HEADERS[9].replaceFirst("\\{0\\}", "21")));
877880
}
878881

882+
@ParameterizedTest(name = "{0}")
883+
@MethodSource("testSystemOutOfResourcesError_args")
884+
public void testSystemOutOfResourcesError(String jdkAndLocale, String stackTraceHeader) throws Exception {
885+
String stackTraceWithHeader = UNIDENTIFIED_LOG_LINES + stackTraceHeader + stackTraceSystemOutOfResourcesError;
886+
887+
List<CompilerMessage> compilerMessages =
888+
JavacCompiler.parseModernStream(4, new BufferedReader(new StringReader(stackTraceWithHeader)));
889+
890+
assertThat(compilerMessages, notNullValue());
891+
assertThat(compilerMessages, hasSize(1));
892+
893+
String message = compilerMessages.get(0).getMessage().replaceAll(EOL, "\n");
894+
// Parser retains stack trace header
895+
assertThat(message, startsWith(stackTraceHeader));
896+
assertThat(message, endsWith(stackTraceSystemOutOfResourcesError));
897+
}
898+
899+
private static final String stackTraceSystemOutOfResourcesError =
900+
"java.lang.OutOfMemoryError: GC overhead limit exceeded\n"
901+
+ "\tat com.sun.tools.javac.util.List.of(List.java:135)\n"
902+
+ "\tat com.sun.tools.javac.util.ListBuffer.append(ListBuffer.java:129)\n"
903+
+ "\tat com.sun.tools.javac.parser.JavacParser.variableDeclaratorsRest(JavacParser.java:3006)\n"
904+
+ "\tat com.sun.tools.javac.parser.JavacParser.classOrInterfaceBodyDeclaration(JavacParser.java:3537)\n"
905+
+ "\tat com.sun.tools.javac.parser.JavacParser.classOrInterfaceBody(JavacParser.java:3436)\n"
906+
+ "\tat com.sun.tools.javac.parser.JavacParser.classDeclaration(JavacParser.java:3285)\n"
907+
+ "\tat com.sun.tools.javac.parser.JavacParser.classOrInterfaceOrEnumDeclaration(JavacParser.java:3226)\n"
908+
+ "\tat com.sun.tools.javac.parser.JavacParser.typeDeclaration(JavacParser.java:3215)\n"
909+
+ "\tat com.sun.tools.javac.parser.JavacParser.parseCompilationUnit(JavacParser.java:3155)\n"
910+
+ "\tat com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:628)\n"
911+
+ "\tat com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:665)\n"
912+
+ "\tat com.sun.tools.javac.main.JavaCompiler.parseFiles(JavaCompiler.java:950)\n"
913+
+ "\tat com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:857)\n"
914+
+ "\tat com.sun.tools.javac.main.Main.compile(Main.java:523)\n"
915+
+ "\tat com.sun.tools.javac.main.Main.compile(Main.java:381)\n"
916+
+ "\tat com.sun.tools.javac.main.Main.compile(Main.java:370)\n"
917+
+ "\tat com.sun.tools.javac.main.Main.compile(Main.java:361)\n"
918+
+ "\tat com.sun.tools.javac.Main.compile(Main.java:56)\n"
919+
+ "\tat com.sun.tools.javac.Main.main(Main.java:42)\n";
920+
921+
private static Stream<Arguments> testSystemOutOfResourcesError_args() {
922+
return Stream.of(
923+
Arguments.of("JDK 8 English", SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[0]),
924+
Arguments.of("JDK 8 Japanese", SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[1]),
925+
Arguments.of("JDK 8 Chinese", SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[2]),
926+
Arguments.of("JDK 21 English", SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[3]),
927+
Arguments.of("JDK 21 Japanese", SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[4]),
928+
Arguments.of("JDK 21 Chinese", SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[5]),
929+
Arguments.of("JDK 21 German", SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[6]));
930+
}
931+
879932
@Test
880933
public void testNonAnchoredWarning() throws IOException {
881934
final String error = "warning: [options] bootstrap class path not set in conjunction with -source 1.6" + EOL

0 commit comments

Comments
 (0)