~ scripts
diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLIConfigurationKeys.java b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLIConfigurationKeys.java
index b0f7c7f..dc88698 100644
--- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLIConfigurationKeys.java
+++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLIConfigurationKeys.java
@@ -16,6 +16,7 @@
 
 package org.jetbrains.kotlin.cli.common;
 
+import kotlin.jvm.functions.Function2;
 import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig;
 import org.jetbrains.kotlin.cli.common.config.ContentRoot;
 import org.jetbrains.kotlin.cli.common.messages.MessageCollector;
@@ -51,6 +52,9 @@
     public static final CompilerConfigurationKey<Integer> REPEAT_COMPILE_MODULES =
             CompilerConfigurationKey.create("debug key for profiling, repeats compileModules");
 
+    public static final CompilerConfigurationKey<Function2<File, String, Boolean>> FAST_CHECK_JAR_CONTAINS_FILE =
+            CompilerConfigurationKey.create("Predicate telling if a jar contains a file");
+
     private CLIConfigurationKeys() {
     }
 }
diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt
index 7be1516..ea84212 100644
--- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt
+++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt
@@ -188,16 +188,6 @@
 
         registerProjectServices(projectEnvironment.project)
 
-        for (extension in CompilerConfigurationExtension.getInstances(project)) {
-            extension.updateConfiguration(configuration)
-        }
-
-        sourceFiles += createKtFiles(project)
-
-        collectAdditionalSources(project)
-
-        sourceFiles.sortBy { it.virtualFile.path }
-
         val jdkHome = configuration.get(JVMConfigurationKeys.JDK_HOME)
         val jrtFileSystem = VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.JRT_PROTOCOL)
         val javaModuleFinder = CliJavaModuleFinder(jdkHome?.path?.let { path ->
@@ -222,6 +212,20 @@
             classpathRootsResolver.convertClasspathRoots(configuration.getList(CLIConfigurationKeys.CONTENT_ROOTS))
         this.initialRoots.addAll(initialRoots)
 
+        configuration.put(CLIConfigurationKeys.FAST_CHECK_JAR_CONTAINS_FILE) { file, path ->
+            findJarRoot(file)?.findFileByRelativePath(path) != null
+        }
+
+        for (extension in CompilerConfigurationExtension.getInstances(project)) {
+            extension.updateConfiguration(configuration)
+        }
+
+        sourceFiles += createKtFiles(project)
+
+        collectAdditionalSources(project)
+
+        sourceFiles.sortBy { it.virtualFile.path }
+
         if (!configuration.getBoolean(JVMConfigurationKeys.SKIP_RUNTIME_VERSION_CHECK) && messageCollector != null) {
             JvmRuntimeVersionsConsistencyChecker.checkCompilerClasspathConsistency(
                 messageCollector,
diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/ScriptiDefinitionsFromClasspathDiscoverySource.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/ScriptiDefinitionsFromClasspathDiscoverySource.kt
index 1013584..9a83557 100644
--- a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/ScriptiDefinitionsFromClasspathDiscoverySource.kt
+++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/ScriptiDefinitionsFromClasspathDiscoverySource.kt
@@ -21,10 +21,13 @@
 
 typealias MessageReporter = (ScriptDiagnostic.Severity, String) -> Unit
 
+typealias FastCheckForJarEntryPresence = (jarFile: File, entry: String) -> Boolean
+
 class ScriptDefinitionsFromClasspathDiscoverySource(
     private val classpath: List<File>,
     private val hostConfiguration: ScriptingHostConfiguration,
-    private val messageReporter: MessageReporter
+    private val messageReporter: MessageReporter,
+    private val fastCheckForJarEntryPresence: FastCheckForJarEntryPresence? = null,
 ) : ScriptDefinitionsSource {
 
     override val definitions: Sequence<ScriptDefinition> = run {
@@ -32,7 +35,8 @@
             classpath,
             this::class.java.classLoader,
             hostConfiguration,
-            messageReporter
+            messageReporter,
+            fastCheckForJarEntryPresence,
         )
     }
 }
@@ -52,25 +56,27 @@
         }
     }
     val classpathWithLoader = SimpleClasspathWithClassLoader(classpath.toList(), classLoader)
-    return scriptTemplatesDiscoverySequence(classpathWithLoader, hostConfiguration, messageReporter)
+    return scriptTemplatesDiscoverySequence(classpathWithLoader, hostConfiguration, messageReporter, fastCheckForJarEntryPresence = null)
 }
 
 fun discoverScriptTemplatesInClasspath(
     classpath: List<File>,
     baseClassLoader: ClassLoader?,
     hostConfiguration: ScriptingHostConfiguration,
-    messageReporter: MessageReporter
+    messageReporter: MessageReporter,
+    fastCheckForJarEntryPresence: FastCheckForJarEntryPresence? = null,
 ): Sequence<ScriptDefinition> {
     // TODO: try to find a way to reduce classpath (and classloader) to minimal one needed to load script definition and its dependencies
     val classpathWithLoader = LazyClasspathWithClassLoader(baseClassLoader) { classpath }
 
-    return scriptTemplatesDiscoverySequence(classpathWithLoader, hostConfiguration, messageReporter)
+    return scriptTemplatesDiscoverySequence(classpathWithLoader, hostConfiguration, messageReporter, fastCheckForJarEntryPresence)
 }
 
 private fun scriptTemplatesDiscoverySequence(
     classpathWithLoader: ClasspathWithClassLoader,
     hostConfiguration: ScriptingHostConfiguration,
-    messageReporter: MessageReporter
+    messageReporter: MessageReporter,
+    fastCheckForJarEntryPresence: FastCheckForJarEntryPresence?
 ): Sequence<ScriptDefinition> {
     return sequence<ScriptDefinition> {
         // for jar files the definition class is expected in the same jar as the discovery file
@@ -80,7 +86,10 @@
         for (dep in classpathWithLoader.classpath) {
             try {
                 when {
-                    dep.isFile && dep.extension == "jar" -> { // checking for extension is the compiler current behaviour, so the same logic is implemented here
+                    dep.isFile && dep.extension == "jar" &&
+                            fastCheckForJarEntryPresence?.invoke(dep, SCRIPT_DEFINITION_MARKERS_PATH) != false
+                    -> {
+                        // checking for extension is the compiler current behaviour, so the same logic is implemented here
                         JarFile(dep).use { jar ->
                             if (jar.getJarEntry(SCRIPT_DEFINITION_MARKERS_PATH) != null) {
                                 val definitionNames = jar.entries().asSequence().mapNotNull {
diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerConfigurationExtension.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerConfigurationExtension.kt
index 328db81..d1af3fa 100644
--- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerConfigurationExtension.kt
+++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerConfigurationExtension.kt
@@ -73,7 +73,8 @@
                     ScriptDefinitionsFromClasspathDiscoverySource(
                         configuration.jvmClasspathRoots,
                         hostConfiguration,
-                        messageCollector.reporter
+                        messageCollector.reporter,
+                        fastCheckForJarEntryPresence = configuration.get(CLIConfigurationKeys.FAST_CHECK_JAR_CONTAINS_FILE),
                     ),
                     AutoloadedScriptDefinitions(hostConfiguration, this::class.java.classLoader, messageCollector.reporter)
                 )