Skip to content

Commit 2a1fb0f

Browse files
committed
Recognise javac.msg.resource error header
"The system is out of resources. Consult the following stack trace for details."
1 parent cdc2766 commit 2a1fb0f

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
@@ -172,6 +172,18 @@ protected static class Messages {
172172
"编译器 ({0}) 中出现异常错误。如果在 Bug Database (https://bugs.java.com) 中没有找到有关该错误的 Java 编译器 Bug,请通过 Java Bug 报告页 (https://bugreport.java.com) 提交 Java 编译器 Bug。请在报告中附上您的程序、以下诊断信息以及传递到 Java 编译器的参数。谢谢。\n",
173173
"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"
174174
};
175+
176+
// javac.properties-> javac.msg.resource
177+
// (en JDK-8, ja JDK-8, zh_CN JDK-8, en JDK-21, ja JDK-21, zh_CN JDK-21, de JDK-21)
178+
protected static final String[] SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS = {
179+
"\n\nThe system is out of resources.\nConsult the following stack trace for details.\n",
180+
"\n\nシステム・リソースが不足しています。\n詳細は次のスタック・トレースで調査してください。\n",
181+
"\n\n系统资源不足。\n有关详细信息, 请参阅以下堆栈跟踪。\n",
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\nDas System hat keine Ressourcen mehr.\nDetails finden Sie im folgenden Stacktrace.\n"
186+
};
175187
}
176188

177189
private static final Object LOCK = new Object();
@@ -755,7 +767,8 @@ static List<CompilerMessage> parseModernStream(int exitCode, BufferedReader inpu
755767
|| (cleanedUpMessage = getBootLayerInitError(bufferContent)) != null
756768
|| (cleanedUpMessage = getVMInitError(bufferContent)) != null
757769
|| (cleanedUpMessage = getFileABugError(bufferContent)) != null
758-
|| (cleanedUpMessage = getAnnotationProcessingError(bufferContent)) != null) {
770+
|| (cleanedUpMessage = getAnnotationProcessingError(bufferContent)) != null
771+
|| (cleanedUpMessage = getSystemOutOfResourcesError(bufferContent)) != null) {
759772
errors.add(new CompilerMessage(cleanedUpMessage, ERROR));
760773
} else if (hasPointer) {
761774
// A compiler message remains in buffer at end of parse stream
@@ -816,6 +829,10 @@ private static String getAnnotationProcessingError(String message) {
816829
return getTextStartingWithPrefix(message, ANNOTATION_PROCESSING_ERROR_HEADERS);
817830
}
818831

832+
private static String getSystemOutOfResourcesError(String message) {
833+
return getTextStartingWithPrefix(message, SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS);
834+
}
835+
819836
private static boolean startsWithPrefix(String text, String[] prefixes) {
820837
for (String prefix : prefixes) {
821838
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)