From bf6b954065a58564adf1a115c439f5a3d9155ead Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Wed, 1 Oct 2025 14:49:18 +0200 Subject: [PATCH] IJPL-209419 don't pack libs that are part of the product modules GitOrigin-RevId: 7d57bcf8e7de79b98ff6287d7102292439fa8f8a --- .../intellij/build/impl/PlatformModules.kt | 54 ++++++++++++++++--- .../src/META-INF/essential-libs.xml | 4 +- platform/util/http/BUILD.bazel | 7 ++- .../util/http/intellij.platform.util.http.iml | 5 +- platform/wsl-impl/BUILD.bazel | 4 +- .../wsl-impl/intellij.platform.wsl.impl.iml | 2 +- 6 files changed, 56 insertions(+), 20 deletions(-) diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/PlatformModules.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/PlatformModules.kt index 7a8cbced20b8..7abf4f60668b 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/PlatformModules.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/PlatformModules.kt @@ -26,6 +26,7 @@ import org.jetbrains.intellij.build.impl.PlatformJarNames.TEST_FRAMEWORK_JAR import org.jetbrains.jps.model.java.JavaSourceRootType import org.jetbrains.jps.model.java.JpsJavaClasspathKind import org.jetbrains.jps.model.java.JpsJavaExtensionService +import org.jetbrains.jps.model.module.JpsLibraryDependency import org.jetbrains.jps.model.module.JpsModuleReference import java.nio.file.Files import java.nio.file.Path @@ -304,14 +305,7 @@ internal suspend fun createPlatformLayout(projectLibrariesUsedByPlugins: SortedS .sortedBy { it.moduleName }, ) - val libAsProductModule: HashSet = layout.includedModules.mapNotNullTo(HashSet()) { - if (it.moduleName.startsWith(LIB_MODULE_PREFIX)) { - it.moduleName.substring(LIB_MODULE_PREFIX.length).replace('.', '-') - } - else { - null - } - } + val libAsProductModule = collectExportedLibrariesFromLibraryModules(layout, context).keys layout.libAsProductModule = libAsProductModule // sqlite - used by DB and "import settings" (temporarily) @@ -354,6 +348,50 @@ internal suspend fun createPlatformLayout(projectLibrariesUsedByPlugins: SortedS return layout } +/** + * Collects names of libraries that are exported by library modules (modules with prefix [LIB_MODULE_PREFIX]). + * + * Library modules like `intellij.libraries.grpc` export one or more project libraries + * (e.g., `grpc-core`, `grpc-stub`, `grpc-kotlin-stub`, `grpc-protobuf`). + * These exported libraries should be treated as product modules and not included separately. + * + * Note: We cannot replace all direct library references with library modules due to: + * - Dual project structures (Fleet, Toolbox) that require direct library references + * - Modules used in both production and build scripts (e.g., `intellij.platform.buildScripts.downloader`) + * + * @param layout the platform layout containing included modules + * @param context the build context + * @return map from library name to the library module that exports it + */ +fun collectExportedLibrariesFromLibraryModules( + layout: PlatformLayout, + context: BuildContext +): Map { + val javaExtensionService = JpsJavaExtensionService.getInstance() + val result = mutableMapOf() + + layout.includedModules + .asSequence() + .filter { it.moduleName.startsWith(LIB_MODULE_PREFIX) } + .forEach { moduleItem -> + val module = context.findRequiredModule(moduleItem.moduleName) + // Get all library dependencies from the module + module.dependenciesList.dependencies + .asSequence() + .filterIsInstance() + .filter { libDep -> + // Check if this library is exported + javaExtensionService.getDependencyExtension(libDep)?.isExported == true + } + .mapNotNull { it.library?.name } + .forEach { libName -> + result[libName] = moduleItem.moduleName + } + } + + return result +} + private fun getProductModuleJarName(moduleName: String, context: BuildContext, frontendModuleFilter: FrontendModuleFilter): String { return when { isModuleCloseSource(moduleName, context = context) -> if (frontendModuleFilter.isBackendModule(moduleName)) PRODUCT_BACKEND_JAR else PRODUCT_JAR diff --git a/platform/platform-resources/src/META-INF/essential-libs.xml b/platform/platform-resources/src/META-INF/essential-libs.xml index 3ac28210de39..30411bbfe400 100644 --- a/platform/platform-resources/src/META-INF/essential-libs.xml +++ b/platform/platform-resources/src/META-INF/essential-libs.xml @@ -5,7 +5,7 @@ - - + + \ No newline at end of file diff --git a/platform/util/http/BUILD.bazel b/platform/util/http/BUILD.bazel index 6616c2d744e7..78f55572b0a8 100644 --- a/platform/util/http/BUILD.bazel +++ b/platform/util/http/BUILD.bazel @@ -11,9 +11,8 @@ jvm_library( "@lib//:kotlin-stdlib", "@lib//:kotlinx-coroutines-core", "@lib//:jetbrains-annotations", - "@lib//:ktor-client-core", - "@lib//:ktor-client-java", - ], - runtime_deps = ["@lib//:kotlinx-io-core"] + "//libraries/ktor-client", + "//libraries/io", + ] ) ### auto-generated section `build intellij.platform.util.http` end \ No newline at end of file diff --git a/platform/util/http/intellij.platform.util.http.iml b/platform/util/http/intellij.platform.util.http.iml index c7a83c962e00..42098be665f6 100644 --- a/platform/util/http/intellij.platform.util.http.iml +++ b/platform/util/http/intellij.platform.util.http.iml @@ -26,8 +26,7 @@ - - - + + \ No newline at end of file diff --git a/platform/wsl-impl/BUILD.bazel b/platform/wsl-impl/BUILD.bazel index 28e02a123780..de898588c9df 100644 --- a/platform/wsl-impl/BUILD.bazel +++ b/platform/wsl-impl/BUILD.bazel @@ -16,7 +16,7 @@ jvm_library( "@lib//:lz4-java", "//platform/util-ex", "@lib//:ktor-network-tls", - ], - runtime_deps = ["@lib//:kotlinx-io-core"] + "//libraries/io", + ] ) ### auto-generated section `build intellij.platform.wsl.impl` end \ No newline at end of file diff --git a/platform/wsl-impl/intellij.platform.wsl.impl.iml b/platform/wsl-impl/intellij.platform.wsl.impl.iml index beceb5566e29..7418c0a1708c 100644 --- a/platform/wsl-impl/intellij.platform.wsl.impl.iml +++ b/platform/wsl-impl/intellij.platform.wsl.impl.iml @@ -16,6 +16,6 @@ - + \ No newline at end of file