diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTest.java
index df440d9bd3c..2d423777da9 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTest.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTest.java
@@ -13,6 +13,8 @@
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.dom;
 
+import static org.junit.Assert.assertThrows;
+
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -21,6 +23,7 @@
 import java.util.Map;
 import java.util.Set;
 import junit.framework.Test;
+import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jdt.core.IClassFile;
 import org.eclipse.jdt.core.ICompilationUnit;
@@ -1445,4 +1448,39 @@ public void acceptAST(String sourceFilePath, CompilationUnit cu) {
 	parser.createASTs(paths, null, new String[] {}, new MyFileASTRequestor() {}, null);
 	assertEquals(expectedProblems, actualProblems);
 }
+public void testGH3298() throws Exception {
+	Hashtable<String, String> options = JavaCore.getDefaultOptions();
+	options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_9);
+	options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_9);
+	options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_9);
+
+	IProject project = createProject("P");
+	IJavaProject javaProject = JavaCore.create(project);
+	try {
+		ASTParser parser = ASTParser.newParser(AST.getJLSLatest());
+		parser.setProject(javaProject);
+		parser.setCompilerOptions(options);
+		parser.setSource("public class Test{}".toCharArray());
+		parser.setResolveBindings(true);
+		parser.setKind(ASTParser.K_COMPILATION_UNIT);
+		assertNotNull(parser.createAST(null));
+
+		addJavaNature("P");
+		parser.setProject(javaProject);
+		parser.setCompilerOptions(options);
+		parser.setSource("public class Test{}".toCharArray());
+		parser.setResolveBindings(true);
+		parser.setKind(ASTParser.K_COMPILATION_UNIT);
+		assertThrows(IllegalStateException.class, () -> parser.createAST(null));
+
+		parser.setProject(javaProject);
+		parser.setCompilerOptions(options);
+		parser.setSource("public class Test{}".toCharArray());
+		parser.setResolveBindings(false);
+		parser.setKind(ASTParser.K_COMPILATION_UNIT);
+		assertNotNull(parser.createAST(null));
+	} finally {
+		deleteProject("P");
+	}
+}
 }
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTParser.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTParser.java
index 6223e6f1aaa..3252700db18 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTParser.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTParser.java
@@ -44,6 +44,7 @@
 import org.eclipse.jdt.internal.core.ClassFileWorkingCopy;
 import org.eclipse.jdt.internal.core.DefaultWorkingCopyOwner;
 import org.eclipse.jdt.internal.core.JavaModelManager;
+import org.eclipse.jdt.internal.core.JavaProject;
 import org.eclipse.jdt.internal.core.PackageFragment;
 import org.eclipse.jdt.internal.core.dom.ICompilationUnitResolver;
 import org.eclipse.jdt.internal.core.dom.util.DOMASTUtil;
@@ -306,7 +307,7 @@ private void checkForSystemLibrary(List<Classpath> allClasspaths) {
 					}
 				}
 			}
-			if (!hasSystemLibrary)
+			if (!hasSystemLibrary && hasJavaNature())
 				throw new IllegalStateException("Missing system library", exception); //$NON-NLS-1$
 		}
 	}
@@ -1562,4 +1563,8 @@ private void rootNodeToCompilationUnit(AST ast, CompilationUnit compilationUnit,
 				}
 		}
 	}
+
+	private boolean hasJavaNature() {
+		return this.project != null && JavaProject.hasJavaNature(this.project.getProject());
+	}
 }