From b832e6c2e03dae096a9df7a63d1d2a77a0a3e8c9 Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 20 Nov 2017 14:48:35 +0300 Subject: [PATCH] build scripts: allow removing version numbers from JAR names When a library is converted to repository library, its version is included into its JAR name. So if we convert a library included into bootstrap classpath (names of such libraries are hardcoded in executables) we need to keep the old name to avoid changing executables each time the library is updated. Later we can automatically compose bootstrap classpath and this won't be needed. --- .../build/impl/DistributionJARsBuilder.groovy | 2 +- .../intellij/build/impl/LayoutBuilder.groovy | 24 +++++++++++++++---- .../intellij/build/impl/PlatformLayout.groovy | 11 +++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) 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 e51bfdd8f144..e0c5cc12beff 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 @@ -406,7 +406,7 @@ class DistributionJARsBuilder { } } layout.includedProjectLibraries.each { - projectLibrary(it) + projectLibrary(it, layout instanceof PlatformLayout && layout.projectLibrariesWithRemovedVersionFromJarNames.contains(it)) } layout.includedArtifacts.entrySet().each { def artifactName = it.key diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/LayoutBuilder.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/LayoutBuilder.groovy index 35eabbcf1123..aa7b0b3fbf2d 100644 --- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/LayoutBuilder.groovy +++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/LayoutBuilder.groovy @@ -26,6 +26,8 @@ import org.jetbrains.jps.model.artifact.JpsArtifactService import org.jetbrains.jps.model.library.JpsLibrary import org.jetbrains.jps.model.library.JpsOrderRootType import org.jetbrains.jps.model.module.JpsModule + +import java.util.regex.Pattern /** * Use this class to pack output of modules and libraries into JARs and lay out them by directories. It delegates the actual work to * {@link jetbrains.antlayout.tasks.LayoutTask}. @@ -157,13 +159,15 @@ class LayoutBuilder { /** * Include JARs added as classes roots of project library {@code libraryName} to the current place in the layout + * @param removeVersionFromJarName if {@code true} versions will be removed from the JAR names. It may be used to temporary + * keep names of JARs included into bootstrap classpath only. */ - def projectLibrary(String libraryName) { + def projectLibrary(String libraryName, boolean removeVersionFromJarName = false) { def library = project.libraryCollection.findLibrary(libraryName) if (library == null) { throw new IllegalArgumentException("Cannot find library $libraryName in the project") } - jpsLibrary(library) + jpsLibrary(library, removeVersionFromJarName) } /** @@ -195,9 +199,21 @@ class LayoutBuilder { jpsLibrary(library) } - def jpsLibrary(JpsLibrary library) { + private static final Pattern JAR_NAME_WITH_VERSION_PATTERN = ~/(.*)-\d+(?:\.\d+)*\.jar*/ + + /** + * @param removeVersionFromJarName if {@code true} versions will be removed from the JAR names. It may be used to temporary + * * keep names of JARs included into bootstrap classpath only. + **/ + def jpsLibrary(JpsLibrary library, boolean removeVersionFromJarName = false) { library.getFiles(JpsOrderRootType.COMPILED).each { - ant.fileset(file: it.absolutePath) + def matcher = it.name =~ JAR_NAME_WITH_VERSION_PATTERN + if (removeVersionFromJarName && matcher.matches()) { + ant.renamedFile(filePath: it.absolutePath, newName: matcher.group(1) + ".jar") + } + else { + ant.fileset(file: it.absolutePath) + } } } diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/PlatformLayout.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/PlatformLayout.groovy index b5bdeaebc1c9..1b8c5b84a739 100644 --- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/PlatformLayout.groovy +++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/PlatformLayout.groovy @@ -32,6 +32,7 @@ import java.util.function.Consumer */ class PlatformLayout extends BaseLayout { List excludedProjectLibraries = [] + final List projectLibrariesWithRemovedVersionFromJarNames = [] static PlatformLayout platform(Consumer customizer, @DelegatesTo(PlatformLayoutSpec) Closure body = {}) { def layout = new PlatformLayout() @@ -61,6 +62,16 @@ class PlatformLayout extends BaseLayout { layout.excludedProjectLibraries << libraryName } + /** + * Remove version numbers from {@code libraryName}'s JAR file names before copying to the product distributions. Currently it's needed + * for libraries included into bootstrap classpath of the platform, because their names are hardcoded in startup scripts and it's not + * convenient to change them each time the library is updated. Do not use this method for anything else. This method + * will be removed when build scripts automatically compose bootstrap classpath. + */ + void removeVersionFromProjectLibraryJarNames(String libraryName) { + layout.projectLibrariesWithRemovedVersionFromJarNames << libraryName + } + /** * Include all project libraries from dependencies of modules already included into layout to 'lib' directory */