From 4fb1fa3706daf3b9c00fb651c59ba06c20e5f73c Mon Sep 17 00:00:00 2001 From: Goooler Date: Mon, 23 Jun 2025 23:52:58 +0800 Subject: [PATCH 01/10] Add Gradle 8.3 into test matrix --- .github/workflows/build.yml | 4 +++- build.gradle.kts | 6 ++++++ .../gradle/plugins/shadow/snippet/SnippetExecutable.kt | 4 ++++ .../jengelman/gradle/plugins/shadow/BasePluginTest.kt | 4 ++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cab16e3fb..25cd94491 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,6 +14,8 @@ jobs: os: [ ubuntu-latest, windows-latest ] # Always test on the latest version and some LTS. java: [ 17, 21, 24 ] + # Test on the minimum Gradle version and the latest. + gradle: [ 8.3, current ] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 @@ -22,7 +24,7 @@ jobs: distribution: 'zulu' java-version: ${{ matrix.java }} - uses: gradle/actions/setup-gradle@v4 - - run: ./gradlew build + - run: ./gradlew build "-PtestGradleVersion=${{ matrix.gradle }}" # There's no need to run the update task frequently; the start scripts are typically updated with Gradle releases. update-start-scripts: diff --git a/build.gradle.kts b/build.gradle.kts index ec67e97f0..e50176b12 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -165,6 +165,12 @@ testing.suites { } targets.configureEach { testTask { + val testGradleVersion = providers.gradleProperty("testGradleVersion").orNull.let { + if (it == null || it == "current") GradleVersion.current().version else it + } + logger.info("Using test Gradle version: $testGradleVersion") + systemProperty("TEST_GRADLE_VERSION", testGradleVersion) + maxParallelForks = Runtime.getRuntime().availableProcessors() } } diff --git a/src/documentTest/kotlin/com/github/jengelman/gradle/plugins/shadow/snippet/SnippetExecutable.kt b/src/documentTest/kotlin/com/github/jengelman/gradle/plugins/shadow/snippet/SnippetExecutable.kt index 17130c574..952c13f9d 100644 --- a/src/documentTest/kotlin/com/github/jengelman/gradle/plugins/shadow/snippet/SnippetExecutable.kt +++ b/src/documentTest/kotlin/com/github/jengelman/gradle/plugins/shadow/snippet/SnippetExecutable.kt @@ -65,6 +65,7 @@ sealed class SnippetExecutable : Executable { try { GradleRunner.create() + .withGradleVersion(testGradleVersion) .withProjectDir(projectRoot.toFile()) .withPluginClasspath() .forwardOutput() @@ -108,3 +109,6 @@ sealed class SnippetExecutable : Executable { } } } + +private val testGradleVersion = System.getProperty("TEST_GRADLE_VERSION") + ?: error("TEST_GRADLE_VERSION system property is not set.") diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/BasePluginTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/BasePluginTest.kt index c3f3fb4ee..f5908ae2e 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/BasePluginTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/BasePluginTest.kt @@ -379,6 +379,7 @@ abstract class BasePluginTest { arguments: Iterable = emptyList(), projectDir: Path? = projectRoot, ): GradleRunner = GradleRunner.create() + .withGradleVersion(testGradleVersion) .forwardOutput() .withPluginClasspath() .withTestKitDir(testKitDir.toFile()) @@ -391,6 +392,9 @@ abstract class BasePluginTest { @Suppress("ConstPropertyName") companion object { + private val testGradleVersion = System.getProperty("TEST_GRADLE_VERSION") + ?: error("TEST_GRADLE_VERSION system property is not set.") + val testKitDir: Path = run { var gradleUserHome = System.getenv("GRADLE_USER_HOME") if (gradleUserHome == null) { From cc4552c0ceaff3b23282f1b3e9c55a6cd718b7ed Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 24 Jun 2025 00:00:34 +0800 Subject: [PATCH 02/10] Don't share testKitDir --- .../jengelman/gradle/plugins/shadow/BasePluginTest.kt | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/BasePluginTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/BasePluginTest.kt index f5908ae2e..64f64c5cf 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/BasePluginTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/BasePluginTest.kt @@ -21,8 +21,6 @@ import java.nio.file.Path import java.util.Properties import java.util.jar.JarEntry import kotlin.io.path.ExperimentalPathApi -import kotlin.io.path.Path -import kotlin.io.path.absolutePathString import kotlin.io.path.appendText import kotlin.io.path.createDirectories import kotlin.io.path.createDirectory @@ -382,7 +380,6 @@ abstract class BasePluginTest { .withGradleVersion(testGradleVersion) .forwardOutput() .withPluginClasspath() - .withTestKitDir(testKitDir.toFile()) .withArguments(commonArguments + arguments) .apply { if (projectDir != null) { @@ -395,14 +392,6 @@ abstract class BasePluginTest { private val testGradleVersion = System.getProperty("TEST_GRADLE_VERSION") ?: error("TEST_GRADLE_VERSION system property is not set.") - val testKitDir: Path = run { - var gradleUserHome = System.getenv("GRADLE_USER_HOME") - if (gradleUserHome == null) { - gradleUserHome = Path(System.getProperty("user.home"), ".gradle").absolutePathString() - } - Path(gradleUserHome, "testkit") - } - val junitJar: Path = requireResourceAsPath("junit-3.8.2.jar") val junitRawEntries: List = JarPath(junitJar) .use { it.entries().toList() } From cfb20a534a1a2d6393fb338131d1bdb6c6ecae6c Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 24 Jun 2025 00:05:02 +0800 Subject: [PATCH 03/10] Revert "Don't share testKitDir" This reverts commit cc4552c0ceaff3b23282f1b3e9c55a6cd718b7ed. --- .../jengelman/gradle/plugins/shadow/BasePluginTest.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/BasePluginTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/BasePluginTest.kt index 64f64c5cf..f5908ae2e 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/BasePluginTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/BasePluginTest.kt @@ -21,6 +21,8 @@ import java.nio.file.Path import java.util.Properties import java.util.jar.JarEntry import kotlin.io.path.ExperimentalPathApi +import kotlin.io.path.Path +import kotlin.io.path.absolutePathString import kotlin.io.path.appendText import kotlin.io.path.createDirectories import kotlin.io.path.createDirectory @@ -380,6 +382,7 @@ abstract class BasePluginTest { .withGradleVersion(testGradleVersion) .forwardOutput() .withPluginClasspath() + .withTestKitDir(testKitDir.toFile()) .withArguments(commonArguments + arguments) .apply { if (projectDir != null) { @@ -392,6 +395,14 @@ abstract class BasePluginTest { private val testGradleVersion = System.getProperty("TEST_GRADLE_VERSION") ?: error("TEST_GRADLE_VERSION system property is not set.") + val testKitDir: Path = run { + var gradleUserHome = System.getenv("GRADLE_USER_HOME") + if (gradleUserHome == null) { + gradleUserHome = Path(System.getProperty("user.home"), ".gradle").absolutePathString() + } + Path(gradleUserHome, "testkit") + } + val junitJar: Path = requireResourceAsPath("junit-3.8.2.jar") val junitRawEntries: List = JarPath(junitJar) .use { it.entries().toList() } From 9eff58c6f543e8e9a5b497825555a2749830c8a5 Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 24 Jun 2025 00:08:23 +0800 Subject: [PATCH 04/10] Exclude Java 24 for Gradle 8.3 --- .github/workflows/build.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 25cd94491..de7637461 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,6 +16,10 @@ jobs: java: [ 17, 21, 24 ] # Test on the minimum Gradle version and the latest. gradle: [ 8.3, current ] + exclude: + # Gradle 8.3 doesn't support Java 24. + - gradle: 8.3 + java: 24 runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 From dd535c6d81d7623dc01e4a27b09ebc78a7e0d7f2 Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 1 Jul 2025 17:15:53 +0800 Subject: [PATCH 05/10] Bump the min Gradle requirement to 8.11 --- .github/workflows/build.yml | 6 ++-- .../gradle/plugins/shadow/JavaPluginTest.kt | 31 ------------------- .../gradle/plugins/shadow/ShadowBasePlugin.kt | 4 +-- .../plugins/shadow/internal/GradleCompat.kt | 22 +------------ .../plugins/shadow/internal/UnusedTracker.kt | 2 +- 5 files changed, 7 insertions(+), 58 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index de7637461..fd2679edf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,10 +15,10 @@ jobs: # Always test on the latest version and some LTS. java: [ 17, 21, 24 ] # Test on the minimum Gradle version and the latest. - gradle: [ 8.3, current ] + gradle: [ 8.11, current ] exclude: - # Gradle 8.3 doesn't support Java 24. - - gradle: 8.3 + # Gradle 8.11 doesn't support Java 24. + - gradle: 8.11 java: 24 runs-on: ${{ matrix.os }} steps: diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/JavaPluginTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/JavaPluginTest.kt index 2acbbeac0..2b116ba06 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/JavaPluginTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/JavaPluginTest.kt @@ -38,8 +38,6 @@ import org.gradle.api.plugins.JavaPlugin import org.gradle.api.tasks.bundling.Jar import org.gradle.testfixtures.ProjectBuilder import org.junit.jupiter.api.Test -import org.junit.jupiter.api.condition.DisabledForJreRange -import org.junit.jupiter.api.condition.JRE import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.ValueSource @@ -92,35 +90,6 @@ class JavaPluginTest : BasePluginTest() { assertThat(shadowConfig.artifacts.files).contains(shadowTask.archiveFile.get().asFile) } - @Test - @DisabledForJreRange( - min = JRE.JAVA_21, - disabledReason = "Gradle 8.3 doesn't support Java 21.", - ) - fun compatibleWithMinGradleVersion() { - val mainClassEntry = writeClass(withImports = true) - projectScriptPath.appendText( - """ - dependencies { - implementation 'junit:junit:3.8.2' - } - """.trimIndent(), - ) - - run(shadowJarTask) { - it.withGradleVersion("8.3") - } - - assertThat(outputShadowJar).useAll { - containsOnly( - "my/", - mainClassEntry, - *junitEntries, - *manifestEntries, - ) - } - } - @Test fun incompatibleWithLowerMinGradleVersion() { runWithFailure(shadowJarTask) { diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowBasePlugin.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowBasePlugin.kt index 77a6c09a7..4b8066c90 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowBasePlugin.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowBasePlugin.kt @@ -11,8 +11,8 @@ import org.gradle.util.GradleVersion public abstract class ShadowBasePlugin : Plugin { override fun apply(project: Project): Unit = with(project) { - if (GradleVersion.current() < GradleVersion.version("8.3")) { - throw GradleException("This version of Shadow supports Gradle 8.3+ only. Please upgrade.") + if (GradleVersion.current() < GradleVersion.version("8.11")) { + throw GradleException("This version of Shadow supports Gradle 8.11+ only. Please upgrade.") } @Suppress("DEPRECATION") extensions.create(EXTENSION_NAME, ShadowExtension::class.java, project) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/GradleCompat.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/GradleCompat.kt index c77a97790..170668b21 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/GradleCompat.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/GradleCompat.kt @@ -2,7 +2,6 @@ package com.github.jengelman.gradle.plugins.shadow.internal import org.gradle.api.Project import org.gradle.api.artifacts.Configuration -import org.gradle.api.artifacts.ProjectDependency import org.gradle.api.distribution.DistributionContainer import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.model.ObjectFactory @@ -18,7 +17,6 @@ import org.gradle.api.tasks.TaskContainer import org.gradle.api.tasks.TaskProvider import org.gradle.jvm.tasks.Jar import org.gradle.jvm.toolchain.JavaToolchainService -import org.gradle.util.GradleVersion /** * Return `runtimeClasspath` or `runtime` configuration. @@ -83,27 +81,9 @@ internal inline fun ObjectFactory.mapProperty( } } -/** - * TODO: this could be removed after bumping the min Gradle requirement to 8.8 or above. - */ internal inline fun ObjectFactory.fileCollection( path: () -> Any, ): ConfigurableFileCollection = fileCollection().apply { @Suppress("UnstableApiUsage") - if (GradleVersion.current() >= GradleVersion.version("8.8")) { - convention(path()) - } else { - setFrom(path()) - } -} - -/** - * TODO: this could be removed after bumping the min Gradle requirement to 8.11 or above. - */ -internal fun ProjectDependency.dependencyProjectCompat(project: Project): Project { - return if (GradleVersion.current() >= GradleVersion.version("8.11")) { - project.project(path) - } else { - return this::class.java.getDeclaredMethod("getDependencyProject").invoke(this) as Project - } + convention(path()) } diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt index f6dfc4ced..b82aaeda7 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt @@ -48,7 +48,7 @@ internal class UnusedTracker( apiDependencies.forEach { dep -> when (dep) { is ProjectDependency -> { - apiJars.addAll(getApiJarsFromProject(dep.dependencyProjectCompat(project))) + apiJars.addAll(getApiJarsFromProject(project.project(dep.path))) addJar(runtimeConfiguration, dep, apiJars) } is FileCollectionDependency -> { From dc6650c0df3fdbbc3f0eda92aeb73672e8630dc8 Mon Sep 17 00:00:00 2001 From: Zongle Wang Date: Tue, 1 Jul 2025 17:25:00 +0800 Subject: [PATCH 06/10] Update changelog --- docs/changes/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changes/README.md b/docs/changes/README.md index d1fc6133d..915346afd 100644 --- a/docs/changes/README.md +++ b/docs/changes/README.md @@ -4,6 +4,7 @@ **Changed** +- Bump the min Gradle requirement to 8.11. ([#1488](https://github.com/GradleUp/shadow/pull/1479)) - Expose Ant as `compile` scope. ([#1488](https://github.com/GradleUp/shadow/pull/1488)) ## [9.0.0-beta17](https://github.com/GradleUp/shadow/releases/tag/9.0.0-beta17) - 2025-06-18 From a378c3f7d19cc47dbeb435768cb8483190e59a00 Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 1 Jul 2025 17:29:00 +0800 Subject: [PATCH 07/10] Update the workflow name --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fd2679edf..790fbacb6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,6 +9,7 @@ on: jobs: build: + name: OS=${{ matrix.os }}, Java=${{ matrix.java }}, Gradle=${{ matrix.gradle }} strategy: matrix: os: [ ubuntu-latest, windows-latest ] From e7791788702203be4a482254e1dea1e5d9f9ad4b Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 1 Jul 2025 17:32:26 +0800 Subject: [PATCH 08/10] Update compatibility matrix --- README.md | 2 +- docs/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 86223feae..89e94bbdd 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Gradle plugin for creating fat/uber JARs with support for package relocation. | 7.0.0+ | 7.x | 8 | [`com.github.johnrengelman.shadow`][johnrengelman's] | | 8.0.0+ | 8.0 | 8 | [`com.github.johnrengelman.shadow`][johnrengelman's] | | 8.3.0+ | 8.3 | 8 | [`com.gradleup.shadow`][gradleup's] | -| 9.0.0+ | 8.3 | 11 | [`com.gradleup.shadow`][gradleup's] | +| 9.0.0+ | 8.11 | 11 | [`com.gradleup.shadow`][gradleup's] | diff --git a/docs/README.md b/docs/README.md index 1428492a0..fead7c937 100644 --- a/docs/README.md +++ b/docs/README.md @@ -27,7 +27,7 @@ dependent libraries into the output jar without incurring the I/O overhead of ex | 7.0.0+ | 7.x | 8 | [`com.github.johnrengelman.shadow`][johnrengelman's] | | 8.0.0+ | 8.0 | 8 | [`com.github.johnrengelman.shadow`][johnrengelman's] | | 8.3.0+ | 8.3 | 8 | [`com.gradleup.shadow`][gradleup's] | -| 9.0.0+ | 8.3 | 11 | [`com.gradleup.shadow`][gradleup's] | +| 9.0.0+ | 8.11 | 11 | [`com.gradleup.shadow`][gradleup's] | ## Benefits of Shadow From 16d10a423bb12538709c68ff0971b8e7121bed97 Mon Sep 17 00:00:00 2001 From: Zongle Wang Date: Tue, 1 Jul 2025 17:36:07 +0800 Subject: [PATCH 09/10] Apply suggestions from code review --- docs/changes/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changes/README.md b/docs/changes/README.md index 915346afd..b0205f029 100644 --- a/docs/changes/README.md +++ b/docs/changes/README.md @@ -4,7 +4,7 @@ **Changed** -- Bump the min Gradle requirement to 8.11. ([#1488](https://github.com/GradleUp/shadow/pull/1479)) +- Bump the min Gradle requirement to 8.11. ([#1479](https://github.com/GradleUp/shadow/pull/1479)) - Expose Ant as `compile` scope. ([#1488](https://github.com/GradleUp/shadow/pull/1488)) ## [9.0.0-beta17](https://github.com/GradleUp/shadow/releases/tag/9.0.0-beta17) - 2025-06-18 From 5be12b2e1e85844ee2986777cc80ec4829c8c8af Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 1 Jul 2025 17:38:53 +0800 Subject: [PATCH 10/10] Cleanup --- .../gradle/plugins/shadow/snippet/SnippetExecutable.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/documentTest/kotlin/com/github/jengelman/gradle/plugins/shadow/snippet/SnippetExecutable.kt b/src/documentTest/kotlin/com/github/jengelman/gradle/plugins/shadow/snippet/SnippetExecutable.kt index 952c13f9d..df3d25ef7 100644 --- a/src/documentTest/kotlin/com/github/jengelman/gradle/plugins/shadow/snippet/SnippetExecutable.kt +++ b/src/documentTest/kotlin/com/github/jengelman/gradle/plugins/shadow/snippet/SnippetExecutable.kt @@ -98,6 +98,9 @@ sealed class SnippetExecutable : Executable { } companion object { + private val testGradleVersion = System.getProperty("TEST_GRADLE_VERSION") + ?: error("TEST_GRADLE_VERSION system property is not set.") + fun create( lang: DslLang, snippet: String, @@ -109,6 +112,3 @@ sealed class SnippetExecutable : Executable { } } } - -private val testGradleVersion = System.getProperty("TEST_GRADLE_VERSION") - ?: error("TEST_GRADLE_VERSION system property is not set.")