From 4d193499a014d84af8a9c4a18f61195fccd1262f Mon Sep 17 00:00:00 2001 From: Nikolay Chashnikov Date: Mon, 15 Dec 2025 13:32:12 +0100 Subject: [PATCH] IJPL-223882 remote dev: fix starting the frontend process from sources without dev build While we still have shared run configurations which start the split mode without dev build (e.g., 'IDEA Split'), they shouldn't fail. Before the change, an attempt to load a content module descriptor from an output directory failed with a rather cryptic error message. GitOrigin-RevId: 62f4f5ef997c2b07093b9af7421905ffc6103e39 --- .../ide/plugins/PluginDescriptorLoader.kt | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/platform/core-impl/src/com/intellij/ide/plugins/PluginDescriptorLoader.kt b/platform/core-impl/src/com/intellij/ide/plugins/PluginDescriptorLoader.kt index 7903af9c9029..e747fd9b41b5 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/PluginDescriptorLoader.kt +++ b/platform/core-impl/src/com/intellij/ide/plugins/PluginDescriptorLoader.kt @@ -38,6 +38,7 @@ import java.util.concurrent.atomic.AtomicReferenceArray import java.util.jar.JarInputStream import java.util.zip.ZipInputStream import javax.xml.stream.XMLStreamException +import kotlin.io.path.isDirectory private val LOG: Logger get() = PluginManagerCore.logger @@ -946,14 +947,20 @@ private fun loadContentModuleDescriptors( } if (isDeprecatedLoader && jarFileForModule != null && Files.exists(jarFileForModule)) { - val raw = MixedDirAndJarDataLoader(files = arrayOf(FileItem(jarFileForModule, subDescriptorFile)), pool = pool, jarOnly = true).use { dataLoader -> + val raw = MixedDirAndJarDataLoader(files = arrayOf(FileItem(jarFileForModule, subDescriptorFile)), pool = pool, jarOnly = !isRunningFromSourcesWithoutDevBuild).use { dataLoader -> val consumer = PluginDescriptorFromXmlStreamConsumer( readContext = loadingContext.readContext, xIncludeLoader = createXIncludeLoader(pathResolver = PluginXmlPathResolver.DEFAULT_PATH_RESOLVER, dataLoader = dataLoader), ) - val data = pool.load(jarFileForModule).use { - it.loadZipEntry(subDescriptorFile) - } ?: error("Failed to load entry '$subDescriptorFile' from jar file '$jarFileForModule'") + val data = + if (isRunningFromSourcesWithoutDevBuild && jarFileForModule.isDirectory()) { + Files.readAllBytes(jarFileForModule.resolve(subDescriptorFile)) + } + else { + pool.load(jarFileForModule).use { + it.loadZipEntry(subDescriptorFile) + } ?: error("Failed to load entry '$subDescriptorFile' from jar file '$jarFileForModule'") + } consumer.consume(data, dataLoader.toString()) consumer.getBuilder() }