From bbc730bf7e1c9434ea2b58338e846c1dc16b4fcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krist=C3=B3f=20Marussy?= Date: Mon, 8 Jul 2024 22:46:41 +0200 Subject: [PATCH] build: publish version catalog and BOM --- .editorconfig | 4 +- build.gradle.kts | 4 +- buildSrc/build.gradle.kts | 10 +-- buildSrc/settings.gradle.kts | 8 +- .../internal/java-conventions.gradle.kts | 74 ++--------------- .../refinery/gradle/maven-bom.gradle.kts | 19 +++++ .../refinery/gradle/maven-publish.gradle.kts | 80 +++++++++++++++++++ gradle/libs.versions.toml | 48 ++++++----- gradle/pluginLibs.versions.toml | 17 ++++ settings.gradle.kts | 11 +++ subprojects/bom-dependencies/build.gradle.kts | 30 +++++++ subprojects/bom/build.gradle.kts | 33 ++++++++ subprojects/versions/build.gradle.kts | 44 ++++++++++ 13 files changed, 282 insertions(+), 100 deletions(-) create mode 100644 buildSrc/src/main/kotlin/tools/refinery/gradle/maven-bom.gradle.kts create mode 100644 buildSrc/src/main/kotlin/tools/refinery/gradle/maven-publish.gradle.kts create mode 100644 gradle/pluginLibs.versions.toml create mode 100644 subprojects/bom-dependencies/build.gradle.kts create mode 100644 subprojects/bom/build.gradle.kts create mode 100644 subprojects/versions/build.gradle.kts diff --git a/.editorconfig b/.editorconfig index 7bf4c4d54..ff5af5228 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2023 The Refinery Authors +# SPDX-FileCopyrightText: 2021-2024 The Refinery Authors # # SPDX-License-Identifier: EPL-2.0 @@ -24,7 +24,7 @@ ij_any_indent_case_from_switch = false indent_style = space indent_size = 2 -[libs.versions.toml] +[*.versions.toml] max_line_length = 999 [*.{ecore,genmodel}] diff --git a/build.gradle.kts b/build.gradle.kts index 3ec6ffe38..e469590a8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,7 +7,7 @@ import org.siouan.frontendgradleplugin.infrastructure.gradle.RunYarn plugins { - alias(libs.plugins.versions) + alias(pluginLibs.plugins.versions) id("tools.refinery.gradle.eclipse") id("tools.refinery.gradle.frontend-worktree") id("tools.refinery.gradle.sonarqube") @@ -76,7 +76,7 @@ val mavenRepositoryTar by tasks.registering(Tar::class) { gradle.projectsEvaluated { mavenRepositoryTar.configure { for (subproject in rootProject.subprojects) { - if (subproject.plugins.hasPlugin(JavaPlugin::class)) { + if (subproject.plugins.hasPlugin(MavenPublishPlugin::class)) { dependsOn(subproject.tasks.named("publishMavenJavaPublicationToFileRepository")) } } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 2326e7a47..8ac9c123f 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -1,12 +1,12 @@ /* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ plugins { `kotlin-dsl` - alias(libs.plugins.versions) + alias(pluginLibs.plugins.versions) } repositories { @@ -15,9 +15,9 @@ repositories { } dependencies { - implementation(libs.gradlePlugin.frontend) - implementation(libs.gradlePlugin.shadow) - implementation(libs.gradlePlugin.sonarqube) + implementation(pluginLibs.frontend) + implementation(pluginLibs.shadow) + implementation(pluginLibs.sonarqube) // https://github.com/gradle/gradle/issues/15383 implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location)) } diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts index 1daa9bbdf..fc9045ac3 100644 --- a/buildSrc/settings.gradle.kts +++ b/buildSrc/settings.gradle.kts @@ -1,13 +1,19 @@ /* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ +rootProject.name = "buildSrc" + dependencyResolutionManagement { versionCatalogs { create("libs") { from(files("../gradle/libs.versions.toml")) } + + create("pluginLibs") { + from(files("../gradle/pluginLibs.versions.toml")) + } } } diff --git a/buildSrc/src/main/kotlin/tools/refinery/gradle/internal/java-conventions.gradle.kts b/buildSrc/src/main/kotlin/tools/refinery/gradle/internal/java-conventions.gradle.kts index a1d8f8f3b..5dc4d934d 100644 --- a/buildSrc/src/main/kotlin/tools/refinery/gradle/internal/java-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/tools/refinery/gradle/internal/java-conventions.gradle.kts @@ -6,19 +6,15 @@ package tools.refinery.gradle.internal import org.gradle.accessors.dm.LibrariesForLibs -import org.gradle.configurationcache.extensions.capitalized import tools.refinery.gradle.utils.EclipseUtils plugins { jacoco java - `maven-publish` - signing id("tools.refinery.gradle.eclipse") + id("tools.refinery.gradle.maven-publish") } -val mavenRepositoryDir = rootProject.layout.buildDirectory.map { it.dir("repo") } - repositories { mavenCentral() } @@ -31,10 +27,12 @@ configurations.testRuntimeClasspath { val libs = the() dependencies { + implementation(platform(project(":refinery-bom-dependencies"))) compileOnly(libs.jetbrainsAnnotations) testCompileOnly(libs.jetbrainsAnnotations) testImplementation(libs.hamcrest) testImplementation(libs.junit.api) + testImplementation(platform(libs.junit.bom)) testRuntimeOnly(libs.junit.engine) testRuntimeOnly(libs.junit.launcher) testImplementation(libs.junit.params) @@ -53,54 +51,8 @@ java { } } -open class MavenArtifactExtension(project: Project) { - var name: String = project.name.split("-").drop(1).joinToString(" ", transform = String::capitalized) - var description: String? = null -} - -val artifactExtension = project.extensions.create("mavenArtifact", project) - -publishing { - publications { - create("mavenJava") { - from(components["java"]) - pom { - name = provider { "Refinery ${artifactExtension.name}" } - description = provider { - val prefix = artifactExtension.description ?: artifactExtension.name.lowercase().capitalized() - "$prefix in Refinery, an efficient graph solver for generating well-formed models" - } - url = "https://refinery.tools/" - licenses { - license { - name = "Eclipse Public License - v 2.0" - url = "https://www.eclipse.org/legal/epl-2.0/" - } - } - developers { - developer { - name = "The Refinery Authors" - url = "https://refinery.tools/" - } - } - scm { - connection = "scm:git:https://github.com/graphs4value/refinery.git" - developerConnection = "scm:git:ssh://github.com:graphs4value/refinery.git" - url = "https://github.com/graphs4value/refinery" - } - issueManagement { - url = "https://github.com/graphs4value/refinery/issues" - } - } - } - } - - repositories { - maven { - name = "file" - setUrl(mavenRepositoryDir.map { uri(it) }) - } - } +publishing.publications.named("mavenJava") { + from(components["java"]) } tasks { @@ -148,11 +100,6 @@ tasks { eclipseClasspath { dependsOn(generateEclipseSourceFolders) } - - named("publishMavenJavaPublicationToFileRepository") { - mustRunAfter(rootProject.tasks.named("cleanMavenRepository")) - outputs.dir(mavenRepositoryDir) - } } fun collectDependentProjects(configuration: Configuration, dependentProjects: MutableCollection) { @@ -192,17 +139,6 @@ gradle.projectsEvaluated { } } -signing { - // The underlying property cannot be set publicly. - @Suppress("UsePropertyAccessSyntax") - setRequired(project.hasProperty("forceSign")) - val signingKeyId = System.getenv("PGP_KEY_ID") - val signingKey = System.getenv("PGP_KEY") - val signingPassword = System.getenv("PGP_PASSWORD") - useInMemoryPgpKeys(signingKeyId, signingKey, signingPassword) - sign(publishing.publications["mavenJava"]) -} - eclipse { EclipseUtils.patchClasspathEntries(this) { entry -> if (entry.path.endsWith("-gen")) { diff --git a/buildSrc/src/main/kotlin/tools/refinery/gradle/maven-bom.gradle.kts b/buildSrc/src/main/kotlin/tools/refinery/gradle/maven-bom.gradle.kts new file mode 100644 index 000000000..0ecbcad68 --- /dev/null +++ b/buildSrc/src/main/kotlin/tools/refinery/gradle/maven-bom.gradle.kts @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.gradle + +plugins { + `java-platform` + id("tools.refinery.gradle.maven-publish") +} + +javaPlatform { + allowDependencies() +} + +publishing.publications.named("mavenJava") { + from(components["javaPlatform"]) +} diff --git a/buildSrc/src/main/kotlin/tools/refinery/gradle/maven-publish.gradle.kts b/buildSrc/src/main/kotlin/tools/refinery/gradle/maven-publish.gradle.kts new file mode 100644 index 000000000..a68e31af8 --- /dev/null +++ b/buildSrc/src/main/kotlin/tools/refinery/gradle/maven-publish.gradle.kts @@ -0,0 +1,80 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.gradle + +import org.gradle.configurationcache.extensions.capitalized + +plugins { + `maven-publish` + signing +} + +val mavenRepositoryDir = rootProject.layout.buildDirectory.map { it.dir("repo") } + +open class MavenArtifactExtension(project: Project) { + var name: String = project.name.split("-").drop(1).joinToString(" ", transform = String::capitalized) + var description: String? = null +} + +val artifactExtension = project.extensions.create("mavenArtifact", project) + +publishing { + publications { + create("mavenJava") { + pom { + name = provider { "Refinery ${artifactExtension.name}" } + description = provider { + val prefix = artifactExtension.description ?: artifactExtension.name.lowercase().capitalized() + "$prefix in Refinery, an efficient graph solver for generating well-formed models" + } + url = "https://refinery.tools/" + licenses { + license { + name = "Eclipse Public License - v 2.0" + url = "https://www.eclipse.org/legal/epl-2.0/" + } + } + developers { + developer { + name = "The Refinery Authors" + url = "https://refinery.tools/" + } + } + scm { + connection = "scm:git:https://github.com/graphs4value/refinery.git" + developerConnection = "scm:git:ssh://github.com:graphs4value/refinery.git" + url = "https://github.com/graphs4value/refinery" + } + issueManagement { + url = "https://github.com/graphs4value/refinery/issues" + } + } + } + } + + repositories { + maven { + name = "file" + setUrl(mavenRepositoryDir.map { uri(it) }) + } + } +} + +tasks.named("publishMavenJavaPublicationToFileRepository") { + mustRunAfter(rootProject.tasks.named("cleanMavenRepository")) + outputs.dir(mavenRepositoryDir) +} + +signing { + // The underlying property cannot be set publicly. + @Suppress("UsePropertyAccessSyntax") + setRequired(project.hasProperty("forceSign")) + val signingKeyId = System.getenv("PGP_KEY_ID") + val signingKey = System.getenv("PGP_KEY") + val signingPassword = System.getenv("PGP_PASSWORD") + useInMemoryPgpKeys(signingKeyId, signingKey, signingPassword) + sign(publishing.publications["mavenJava"]) +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 347ee29ae..7946c7cca 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,27 +4,35 @@ [versions] eclipseCollections = "11.1.0" +ecore = "2.36.0" +ecoreCodegen = "2.38.0" +ecoreXmi = "2.37.0" +gson = "2.11.0" +hamcrest = "2.2" +jcommander = "1.83" +jetbrainsAnnotations = "24.1.0" jetty = "12.0.11" jmh = "1.37" junit = "5.10.3" mockito = "5.12.0" +mwe = "1.12.0" mwe2 = "2.18.0" +ortools = "9.10.4067" +refineryZ3 = "4.12.6" slf4j = "2.0.13" xtext = "2.35.0" +xtextAntlrGenerator = "2.1.1" [libraries] eclipseCollections = { group = "org.eclipse.collections", name = "eclipse-collections", version.ref = "eclipseCollections" } eclipseCollections-api = { group = "org.eclipse.collections", name = "eclipse-collections-api", version.ref = "eclipseCollections" } -ecore = { group = "org.eclipse.emf", name = "org.eclipse.emf.ecore", version = "2.36.0" } -ecore-xmi = { group = "org.eclipse.emf", name = "org.eclipse.emf.ecore.xmi", version = "2.37.0" } -ecore-codegen = { group = "org.eclipse.emf", name = "org.eclipse.emf.codegen.ecore", version = "2.38.0" } -gradlePlugin-frontend = { group = "org.siouan", name = "frontend-jdk21", version = "8.1.0" } -gradlePlugin-shadow = { group = "io.github.goooler.shadow", name = "shadow-gradle-plugin", version = "8.1.8" } -gradlePlugin-sonarqube = { group = "org.sonarsource.scanner.gradle", name = "sonarqube-gradle-plugin", version = "5.1.0.4882" } -gson = { group = "com.google.code.gson", name = "gson", version = "2.11.0" } -hamcrest = { group = "org.hamcrest", name = "hamcrest", version = "2.2" } -jcommander = { group = "org.jcommander", name = "jcommander", version = "1.83" } -jetbrainsAnnotations = { group = "org.jetbrains", name = "annotations", version = "24.1.0" } +ecore = { group = "org.eclipse.emf", name = "org.eclipse.emf.ecore", version.ref = "ecore" } +ecore-codegen = { group = "org.eclipse.emf", name = "org.eclipse.emf.codegen.ecore", version.ref = "ecoreCodegen" } +ecore-xmi = { group = "org.eclipse.emf", name = "org.eclipse.emf.ecore.xmi", version.ref = "ecoreXmi" } +gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" } +hamcrest = { group = "org.hamcrest", name = "hamcrest", version.ref = "hamcrest" } +jcommander = { group = "org.jcommander", name = "jcommander", version.ref = "jcommander" } +jetbrainsAnnotations = { group = "org.jetbrains", name = "annotations", version.ref = "jetbrainsAnnotations" } jetty-server = { group = "org.eclipse.jetty", name = "jetty-server", version.ref = "jetty" } jetty-servlet = { group = "org.eclipse.jetty.ee10", name = "jetty-ee10-servlet", version.ref = "jetty" } jetty-websocket-api = { group = "org.eclipse.jetty.websocket", name = "jetty-websocket-jetty-api", version.ref = "jetty" } @@ -32,28 +40,26 @@ jetty-websocket-client = { group = "org.eclipse.jetty.websocket", name = "jetty- jetty-websocket-server = { group = "org.eclipse.jetty.ee10.websocket", name = "jetty-ee10-websocket-jetty-server", version.ref = "jetty" } jmh-core = { group = "org.openjdk.jmh", name = "jmh-core", version.ref = "jmh" } jmh-annprocess = { group = "org.openjdk.jmh", name = "jmh-generator-annprocess", version.ref = "jmh" } -junit-api = { group = "org.junit.jupiter", name = "junit-jupiter-api", version.ref = "junit" } -junit-engine = { group = "org.junit.jupiter", name = "junit-jupiter-engine", version.ref = "junit" } -junit-launcher = { group = "org.junit.platform", name = "junit-platform-launcher", version = "1.10.3" } -junit-params = { group = "org.junit.jupiter", name = "junit-jupiter-params", version.ref = "junit" } +junit-api = { group = "org.junit.jupiter", name = "junit-jupiter-api" } +junit-bom = { group = "org.junit", name = "junit-bom", version.ref = "junit" } +junit-engine = { group = "org.junit.jupiter", name = "junit-jupiter-engine" } +junit-launcher = { group = "org.junit.platform", name = "junit-platform-launcher" } +junit-params = { group = "org.junit.jupiter", name = "junit-jupiter-params" } mockito-core = { group = "org.mockito", name = "mockito-core", version.ref = "mockito" } mockito-junit = { group = "org.mockito", name = "mockito-junit-jupiter", version.ref = "mockito" } -mwe-utils = { group = "org.eclipse.emf", name = "org.eclipse.emf.mwe.utils", version = "1.12.0" } +mwe-utils = { group = "org.eclipse.emf", name = "org.eclipse.emf.mwe.utils", version.ref = "mwe" } mwe2-launch = { group = "org.eclipse.emf", name = "org.eclipse.emf.mwe2.launch", version.ref = "mwe2" } mwe2-lib = { group = "org.eclipse.emf", name = "org.eclipse.emf.mwe2.lib", version.ref = "mwe2" } -ortools = { group = "com.google.ortools", name = "ortools-java", version = "9.10.4067" } -refinery-z3 = { group = "tools.refinery.z3", name = "refinery-z3-solver", version = "4.12.6" } +ortools = { group = "com.google.ortools", name = "ortools-java", version.ref = "ortools" } +refinery-z3 = { group = "tools.refinery.z3", name = "refinery-z3-solver", version.ref = "refineryZ3" } slf4j-api = { group = "org.slf4j", name = "slf4j-api", version.ref = "slf4j" } slf4j-simple = { group = "org.slf4j", name = "slf4j-simple", version.ref = "slf4j" } slf4j-log4j = { group = "org.slf4j", name = "log4j-over-slf4j", version.ref = "slf4j" } xtext-core = { group = "org.eclipse.xtext", name = "org.eclipse.xtext", version.ref = "xtext" } -xtext-generator-antlr = { group = "org.eclipse.xtext", name = "xtext-antlr-generator", version = "2.1.1" } +xtext-generator-antlr = { group = "org.eclipse.xtext", name = "xtext-antlr-generator", version.ref = "xtextAntlrGenerator" } xtext-generator = { group = "org.eclipse.xtext", name = "org.eclipse.xtext.xtext.generator", version.ref = "xtext" } xtext-ide = { group = "org.eclipse.xtext", name = "org.eclipse.xtext.ide", version.ref = "xtext" } xtext-testing = { group = "org.eclipse.xtext", name = "org.eclipse.xtext.testing", version.ref = "xtext" } xtext-web = { group = "org.eclipse.xtext", name = "org.eclipse.xtext.web", version.ref = "xtext" } xtext-xbase = { group = "org.eclipse.xtext", name = "org.eclipse.xtext.xbase", version.ref = "xtext" } xtext-xbase-ide = { group = "org.eclipse.xtext", name = "org.eclipse.xtext.xbase.ide", version.ref = "xtext" } - -[plugins] -versions = { id = "com.github.ben-manes.versions", version = "0.51.0" } diff --git a/gradle/pluginLibs.versions.toml b/gradle/pluginLibs.versions.toml new file mode 100644 index 000000000..33a652426 --- /dev/null +++ b/gradle/pluginLibs.versions.toml @@ -0,0 +1,17 @@ +# SPDX-FileCopyrightText: 2024 The Refinery Authors +# +# SPDX-License-Identifier: EPL-2.0 + +[versions] +frontend = "8.1.0" +shadow = "8.1.8" +sonarqube = "5.1.0.4882" +versions = "0.51.0" + +[libraries] +frontend = { group = "org.siouan", name = "frontend-jdk21", version.ref = "frontend" } +shadow = { group = "io.github.goooler.shadow", name = "shadow-gradle-plugin", version.ref = "shadow" } +sonarqube = { group = "org.sonarsource.scanner.gradle", name = "sonarqube-gradle-plugin", version.ref = "sonarqube" } + +[plugins] +versions = { id = "com.github.ben-manes.versions", version.ref = "versions" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 012e26c55..296640589 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -7,6 +7,8 @@ rootProject.name = "refinery" include( + "bom", + "bom-dependencies", "docs", "frontend", "generator", @@ -29,6 +31,7 @@ include( "store-reasoning", "store-reasoning-scope", "store-reasoning-smt", + "versions", ) for (project in rootProject.children) { @@ -36,3 +39,11 @@ for (project in rootProject.children) { project.name = "${rootProject.name}-$projectName" project.projectDir = file("subprojects/$projectName") } + +dependencyResolutionManagement { + versionCatalogs { + create("pluginLibs") { + from(files("gradle/pluginLibs.versions.toml")) + } + } +} diff --git a/subprojects/bom-dependencies/build.gradle.kts b/subprojects/bom-dependencies/build.gradle.kts new file mode 100644 index 000000000..cd0e4a4b0 --- /dev/null +++ b/subprojects/bom-dependencies/build.gradle.kts @@ -0,0 +1,30 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ + +plugins { + id("tools.refinery.gradle.maven-bom") +} + +mavenArtifact { + name = "Refinery Dependencies BOM" + description = "Java platform that controls the versions of transitive dependencies" +} + +val libsCatalog = versionCatalogs.named("libs") + +dependencies { + api(platform(libs.junit.bom)) + + constraints { + // See https://github.com/gradle/gradle/issues/16784#issuecomment-1520556706 + for (alias in libsCatalog.libraryAliases) { + val dependency = libsCatalog.findLibrary(alias).get() + if (dependency.get().version != null) { + api(dependency) + } + } + } +} diff --git a/subprojects/bom/build.gradle.kts b/subprojects/bom/build.gradle.kts new file mode 100644 index 000000000..61c553911 --- /dev/null +++ b/subprojects/bom/build.gradle.kts @@ -0,0 +1,33 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ + +plugins { + id("tools.refinery.gradle.maven-bom") +} + +mavenArtifact { + name = "Refinery BOM" + description = "Java platform that controls the versions of Refinery and its transitive dependencies" +} + +dependencies { + api(platform(project(":refinery-bom-dependencies"))) + + constraints { + api(platform(project(":refinery-bom-dependencies"))) + api(platform(project(":refinery-versions"))) + } +} + +gradle.projectsEvaluated { + dependencies.constraints { + for (subproject in rootProject.subprojects) { + if (subproject.plugins.hasPlugin(JavaPlugin::class)) { + api(project(subproject.path)) + } + } + } +} diff --git a/subprojects/versions/build.gradle.kts b/subprojects/versions/build.gradle.kts new file mode 100644 index 000000000..cf4467530 --- /dev/null +++ b/subprojects/versions/build.gradle.kts @@ -0,0 +1,44 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ + +plugins { + `version-catalog` + id("tools.refinery.gradle.maven-publish") +} + +mavenArtifact { + name = "Refinery Version Catalog" + description = "Version catalog of Refinery and its dependencies for Gradle" +} + +val refineryVersion = "refinery" +val interpreterVersion = "refineryInterpreter" +val interpreterGroup = property("tools.refinery.interpreter.group").toString() + +catalog.versionCatalog { + from(files("../../gradle/libs.versions.toml")) + version(refineryVersion, project.version.toString()) + version(interpreterVersion, property("tools.refinery.interpreter.version").toString()) + library("bom", group.toString(), "refinery-bom").versionRef(refineryVersion) + library("bom-dependencies", group.toString(), "refinery-bom-dependencies").versionRef(refineryVersion) +} + +publishing.publications.named("mavenJava") { + from(components["versionCatalog"]) +} + +gradle.projectsEvaluated { + catalog.versionCatalog { + for (subproject in rootProject.subprojects) { + if (subproject.plugins.hasPlugin(JavaPlugin::class)) { + val alias = subproject.name.removePrefix("refinery-") + val group = subproject.group.toString() + val versionRef = if (interpreterGroup == group) interpreterVersion else refineryVersion + library(alias, group, subproject.name).versionRef(versionRef) + } + } + } +}