Warning
This release is a major update from the 8.x series. The plugin has been fully rewritten in Kotlin, bringing
significant improvements to maintainability, performance, and future extensibility. It introduces many new features,
enhancements, and bug fixes, and includes several breaking changes. Please review the changelog carefully and consult
the new doc site before upgrading.
If you really don't want to upgrade, you can still use the 8.3.x, which is also Gradle 9 compatible. But no additional features or crucial bug fixes will be included in the 8.x line.
Tip
You can diff the shadowed JARs when upgrading from 8.x to 9.x by using Diffuse.
If there are any things missing in the changelog or the doc site, please report them to us.
Added
- Add .md support to the Apache License and Notice transformers. (#1041)
- Sync
SimpleRelocator
changes from maven-shade-plugin. (#1076) - Support configuring
separator
inAppendingTransformer
. (#1169)
This is useful for handling files likeresources/application.yml
. - Exclude
module-info.class
in Multi-Release folders by default. (#1177) - Inject
TargetJvmVersion
attribute for Gradle Module Metadata. (#1199) - Sync
ShadowApplicationPlugin
withApplicationPlugin
. (#1224) - Inject
Multi-Release
manifest attribute if any dependency contains it. (#1239) - Mark
Transformer
as throwingIOException
. (#1248) - Reduce duplicate
SimpleRelocator
to improve performance. (#1271) - Compat Kotlin Multiplatform plugin. (#1280)
- Add Kotlin DSL examples in docs. (#1306)
- Support using type-safe dependency accessors in
ShadowJar.dependencies
. (#1322) - Support command line options for
ShadowJar
. (#1365)--enable-auto-relocation Enables auto relocation of packages in the dependencies. --no-enable-auto-relocation Disables option --enable-auto-relocation. --fail-on-duplicate-entries Fails build if the ZIP entries in the shadowed JAR are duplicate. --no-fail-on-duplicate-entries Disables option --fail-on-duplicate-entries. --minimize-jar Minimizes the jar by removing unused classes. --no-minimize-jar Disables option --minimize-jar. --relocation-prefix Prefix used for auto relocation of packages in the dependencies. --rerun Causes the task to be re-run even if up-to-date.
- Support skipping string constant remapping. (#1401)
- Let
assemble
depend onshadowJar
. (#1524) - Fail build when inputting AAR files or using Shadow with AGP. (#1530)
- Add
PreserveFirstFoundResourceTransformer
. (#1548)
This is useful when you setshadowJar.duplicatesStrategy = DuplicatesStrategy.INCLUDE
and
want to ensure that only the first found resource is included in the final JAR. - Fail build if the ZIP entries in the shadowed JAR are duplicate. (#1552)
This feature is controlled by theshadowJar.failOnDuplicateEntries
property, which isfalse
by default.
Related to settingduplicatesStrategy = DuplicatesStrategy.FAIL
but there are some differences:- It only checks the entries in the shadowed jar, not the input files.
- It works with setting
duplicatesStrategy
to any value. - It provides a stricter fallback check before the JAR is created.
Changed
- BREAKING CHANGE: Rewrite this plugin in Kotlin. (#1012)
- BREAKING CHANGE: Migrate
Transformer
s to using lazy properties. (#1036) - BREAKING CHANGE: Migrate
ShadowJar
to using lazy properties. (#1044) - BREAKING CHANGE: Resolve
Configuration
directly inDependencyFilter
. (#1045) - BREAKING CHANGE: Migrate
SimpleRelocator
to using lazy properties. (#1047) - BREAKING CHANGE: Some public getters have been updated in
SimpleRelocator
. (#1079) - BREAKING CHANGE: Migrate all
ListProperty
usages toSetProperty
. (#1103)
Some publicList
parameters are also changed toSet
. - BREAKING CHANGE: Mark
RelocatorRemapper
asinternal
. (#1227) - BREAKING CHANGE: Bump min Java requirement to 11. (#1242)
- BREAKING CHANGE: Move tracking unused classes logic out of
ShadowCopyAction
. (#1257) - BREAKING CHANGE: Move
DependencyFilter
intotasks
package. (#1272) - BREAKING CHANGE: Change the default
duplicatesStrategy
fromEXCLUDE
toINCLUDE
. (#1233)ShadowJar
recognizedEXCLUDE
as the default, but the other strategies didn't work properly.- Now
ShadowJar
honorsINCLUDE
as the default, and aligns all the strategy behaviors with the Gradle side. - Some
ResourceTransformer
s (e.g.ServiceFileTransformer
) do not work withEXCLUDE
, as it will exclude duplicate resources to be merged. - Duplicate entries might be bundled due to this change, but you can reduce them by using the newly added
PreserveFirstFoundResourceTransformer
. - Use
filesMatching
to override the default strategy for specific files. - Set
failOnDuplicateEntries = true
to fail the build to check for duplicate entries. - See more details at Handling Duplicates Strategy.
- Note: The default
duplicatesStrategy
is changed back toEXCLUDE
in 9.0.1 release.
- BREAKING CHANGE: Align the behavior of
ShadowTask.from
with Gradle'sAbstractCopyTask.from
. (#1233)
In the previous versions,ShadowTask.from
would always unzip the files before processing them, which caused serial
issues that are hard to fix. Now it behaves like Gradle'sAbstractCopyTask.from
, which means it will not unzip
the files, only copy the files as-is. If you still want to shadow the unzipped files, try out something like:ortasks.shadowJar { // Unzip the files before pass them to `from` by using `zipTree`. from(zipTree(files('path/to/your/file.zip'))) }
dependencies { // Add the files to `implementation` configuration, Shadow will unzip them automatically. implementation(files('path/to/your/file.zip')) }
- BREAKING CHANGE: Rename
Transformer
toResourceTransformer
. (#1288)
Aims to better align with the nameorg.apache.maven.plugins.shade.resource.ResourceTransformer.java
and to distinguish itself fromorg.gradle.api.Transformer.java
. - BREAKING CHANGE: Mark
DefaultInheritManifest
asinternal
. (#1303) - BREAKING CHANGE: Polish
ShadowSpec
. (#1307)- Return values of
ShadowSpec
functions are changed toUnit
to avoid confusion. ShadowSpec
no longer extendsCopySpec
.- Overload
relocate
,transform
and things for better usability in Kotlin.
- Return values of
- BREAKING CHANGE: Remove redundant types from function returning. (#1308)
- BREAKING CHANGE: Rename
ShadowJar
'sisEnableRelocation
toenableAutoRelocation
. (#1541) - BREAKING CHANGE: Some const values in
ShadowBasePlugin
andShadowJavaPlugin
are moved. (#1589)
You can find them inShadowJar
,ShadowApplicationPlugin
, andShadowJavaPlugin
. - Replace deprecated
SelfResolvingDependency
withFileCollectionDependency
. (#1114) - Update start script templates. (#1183)
- Mark more
Transformer
s cacheable. (#1210) - Mark
ShadowJar.dependencyFilter
as@Input
. (#1206) - Polish
startShadowScripts
task registering. (#1216) - Refactor file visiting logic in
StreamAction
, handle file unzipping viaProject.zipTree
. (#1233) - Migrate doc sites to MkDocs. (#1302)
runShadow
no longer depends oninstallShadowDist
. (#1353)- Move the group of
ShadowJar
fromshadow
tobuild
. (#1355) - In-development snapshots are now published to the Central Portal Snapshots repository. (#1414)
- Expose
AbstractDependencyFilter
frominternal
topublic
. (#1538)
You can access it viacom.github.jengelman.gradle.plugins.shadow.tasks.DependencyFilter.AbstractDependencyFilter
. - Mark
Action
parameters as non-null. (#1555) - Use
BufferedOutputStream
when writing the Zip file to improve performance. (#1580)
Fixed
- Fix single Log4j2Plugins.dat isn't included into fat jar. (#1039)
- Fail builds if processing bad jars. (#1146)
- Fix
Log4j2PluginsCacheFileTransformer
not working for mergingLog4j2Plugins.dat
files. (#1175) - Support overriding
mainClass
provided byJavaApplication
. (#1182) - Fix
ShadowJar
not being successful afterincludes
orexcludes
are changed. (#1200) - Honor
DuplicatesStrategy
. (#1233) - Honor unzipped jars via
from
. (#1233) - Fix the last modified time of shadowed directories. (#1277)
- Fix relocation exclusion for file patterns like
kotlin/kotlin.kotlin_builtins
. (#1313) - Allow using file trees of JARs together with the configuration cache. (#1441)
Removed
- BREAKING CHANGE: Some public getters and setters have been removed in
SimpleRelocator
. (#1079) - BREAKING CHANGE: Remove
JavaJarExec
, now useJavaExec
directly forrunShadow
task. (#1197) - BREAKING CHANGE:
ServiceFileTransformer.ServiceStream
has been removed. (#1218) - BREAKING CHANGE: Remove
KnowsTask
as it's useless. (#1236) - BREAKING CHANGE: Remove
BaseStreamAction
. (#1258) - BREAKING CHANGE: Remove
ShadowStats
. (#1264) - BREAKING CHANGE: Remove
ShadowCopyAction.ArchiveFileTreeElement
andRelativeArchivePath
. (#1233) - BREAKING CHANGE: Remove
TransformerContext.getEntryTimestamp
. (#1245) - BREAKING CHANGE: Reduce dependency and project overloads in
DependencyFilter
. (#1328) - BREAKING CHANGE: Remove
ShadowSpec
. (#1560) - BREAKING CHANGE: Remove
Relocator.ROLE
. (#1563) - BREAKING CHANGE: Remove deprecated
ShadowExtension.component
. (#1586)
Migration Example
8.x
tasks.shadowJar {
isEnableRelocation = true
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
mergeServiceFiles()
from("foo.jar")
}
9.x
tasks.shadowJar {
// `isEnableRelocation` has been renamed to `enableAutoRelocation`.
enableAutoRelocation = true
// If you want to make `mergeServiceFiles` work, should set the `duplicatesStrategy` as `INCLUDE`.
// `EXCLUDE` will exclude extra service files to be merged.
duplicatesStrategy = DuplicatesStrategy.INCLUDE
mergeServiceFiles()
// If you leave `duplicatesStrategy` as `INCLUDE`, you can use the new `PreserveFirstFoundResourceTransformer`
// to ensure that only the first found resource is included in the final JAR. Or duplicate entries will be bundled.
transform<PreserveFirstFoundResourceTransformer>() {
resources.add("META-INF/some-resource.txt")
}
// Optionally, you can enable the new `failOnDuplicateEntries` property to fail the build if there are duplicate entries.
failOnDuplicateEntries = true
// If you want to keep the `foo.jar` as-is (zipped), you can use the `from` method directly. This is different from the previous.
from("foo.jar")
// If you want to unzip the `foo.jar` before processing, you can use `zipTree` to unzip it.
from(zipTree("foo.jar"))
}
If you used Shadow for merging service files, the following steps are recommended:
- Make sure to leave
duplicatesStrategy
asINCLUDE
orWARN
. - Apply
mergeServiceFiles
orServiceFileTransformer
stuff as you did in your previous setup. - Diff the JARs from upgrading or not.
- Remove the extra entries that are added by
INCLUDE
byfilesMatching
orPreserveFirstFoundResourceTransformer
. - Diff the JARs again, and check that only the entries you want to preserve remain.
- Optionally, if you want a stricter check for the shadowed JAR entries, enable
failOnDuplicateEntries
.
New Contributors
- @KurdTt made their first contribution in #1039
- @SimonMarquis made their first contribution in #1194
- @andsel made their first contribution in #1241
- @vlsi made their first contribution in #1490
- @Jonathing made their first contribution in #1422
- @DreierF made their first contribution in #1502
- @gabrielfeo made their first contribution in #1505
Full Changelog: 8.3.9...9.0.0