diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/BaseLayout.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/BaseLayout.groovy index 89a61412dcd4..41fb423b9f0f 100644 --- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/BaseLayout.groovy +++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/BaseLayout.groovy @@ -22,7 +22,7 @@ import com.intellij.openapi.util.MultiValuesMap * @author nik */ abstract class BaseLayout { - /** JAR name (or path relative to 'lib' directory) to module name */ + /** JAR name (or path relative to 'lib' directory) to names of modules */ final MultiValuesMap moduleJars = new MultiValuesMap<>(true) final List resourcePaths = [] /** module name to entries which should be excluded from its output */ diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.groovy index 44d8e5b716e8..787f1d9c611e 100644 --- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.groovy +++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.groovy @@ -293,10 +293,22 @@ class DistributionJARsBuilder { def enabledModulesSet = buildContext.productProperties.productLayout.enabledPluginModules pluginsToInclude.each { plugin -> def actualModuleJars = plugin.getActualModules(enabledModulesSet) + checkOutputOfPluginModules(plugin.mainModule, actualModuleJars.values()) buildByLayout(layoutBuilder, plugin, "$targetDirectory/$plugin.directoryName", actualModuleJars) } } + private void checkOutputOfPluginModules(String mainPluginModule, Collection moduleNames) { + def modulesWithPluginXml = moduleNames.findAll { containsFileInOutput(it, "META-INF/plugin.xml") } + if (modulesWithPluginXml.size() > 1) { + buildContext.messages.error("Multiple modules (${modulesWithPluginXml.join(", ")}) from '$mainPluginModule' plugin contain plugin.xml files so the plugin won't work properly") + } + } + + private boolean containsFileInOutput(String moduleName, String filePath) { + return new File(buildContext.projectBuilder.getModuleOutput(buildContext.findRequiredModule(moduleName), false), filePath).exists() + } + private void buildByLayout(LayoutBuilder layoutBuilder, BaseLayout layout, String targetDirectory, MultiValuesMap moduleJars) { def ant = buildContext.ant def resourceExcluded = RESOURCES_EXCLUDED diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/PluginLayout.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/PluginLayout.groovy index e78a3810a182..2144ea7d2420 100644 --- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/PluginLayout.groovy +++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/PluginLayout.groovy @@ -55,6 +55,9 @@ class PluginLayout extends BaseLayout { return layout } + /** + * @return map from a JAR name to list of modules + */ MultiValuesMap getActualModules(Set enabledPluginModules) { def result = new MultiValuesMap(true) for (Map.Entry> entry : moduleJars.entrySet()) {