Description
James Kebinger opened MSHADE-453 and commented
TL;DR - relocation code in CollectingManifestResourceTransformer, ManifestResourceTransformer don't cope well when the shaded package name includes the original package name. The docs on relocations include such an example
—
I'm relocating some packages in a project and have found that all the newest versions of the shading plugin appear to hang after printing the list of artifacts to include/exclude.
Doing a thread dump shows all the time spent in SimpleRelocator and regex classes
"main" #1 [10243] prio=5 os_prio=31 cpu=72973.77ms elapsed=81.89s tid=0x000000014f00d200 nid=10243 runnable [0x000000016dbf1000]
java.lang.Thread.State: RUNNABLE
at java.util.regex.Pattern$Start.match(java.base@19.0.2/Pattern.java:3627)
at java.util.regex.Matcher.search(java.base@19.0.2/Matcher.java:1728)
at java.util.regex.Matcher.find(java.base@19.0.2/Matcher.java:745)
at java.util.regex.Matcher.replaceFirst(java.base@19.0.2/Matcher.java:1404)
at java.lang.String.replaceFirst(java.base@19.0.2/String.java:2906)
at org.apache.maven.plugins.shade.relocation.SimpleRelocator.relocateClass(SimpleRelocator.java:245)
at org.basepom.maven.shade.CollectingManifestResourceTransformer.relocate(CollectingManifestResourceTransformer.java:202)
at org.basepom.maven.shade.CollectingManifestResourceTransformer.processResource(CollectingManifestResourceTransformer.java:116)
at org.apache.maven.plugins.shade.DefaultShader.goThroughAllJarEntriesForManifestTransformer(DefaultShader.java:364)
at org.apache.maven.plugins.shade.DefaultShader.shade(DefaultShader.java:122)
at org.apache.maven.plugins.shade.mojo.ShadeMojo.execute(ShadeMojo.java:500)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:126)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2(MojoExecutor.java:342)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute(MojoExecutor.java:330)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:175)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000(MojoExecutor.java:76)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run(MojoExecutor.java:163)
Can reproduce against this sample project https://github.com/prefab-cloud/mvn-shade-test
Have only tested on an Apple silicon Mac
It appears to be repeatedly transforming the clazz variable in this method in SimpleRelocator
pattern=org.yaml.snakeyaml
shadedPattern=prefab.shaded.org.yaml.snakeyaml
public String relocateClass(String clazz) {
return rawString ? clazz : clazz.replaceFirst(pattern, shadedPattern);
}
So it'll start with eg
org.yaml.snakeyaml;version="1.33",org.yaml.snakeyaml.comments;version="1.33",org.yaml.snakeyaml.composer;version="1.33",org.yaml.snakeyaml.constructor;version="1.33",org.yaml.snakeyaml.emitter;version="1.33",org.yaml.snakeyaml.env;version="1.33",org.yaml.snakeyaml.error;version="1.33",org.yaml.snakeyaml.events;version="1.33",org.yaml.snakeyaml.extensions.compactnotation;version="1.33",org.yaml.snakeyaml.introspector;version="1.33",org.yaml.snakeyaml.nodes;version="1.33",org.yaml.snakeyaml.parser;version="1.33",org.yaml.snakeyaml.reader;version="1.33",org.yaml.snakeyaml.representer;version="1.33",org.yaml.snakeyaml.resolver;version="1.33",org.yaml.snakeyaml.scanner;version="1.33",org.yaml.snakeyaml.serializer;version="1.33",org.yaml.snakeyaml.tokens;version="1.33",org.yaml.snakeyaml.util;version="1.33"
and keep substituting the shaded pattern to build longer and longer string eg
prefab.shaded.prefab.shaded.prefab.shaded.prefab.shaded.prefab.shaded.prefab.shaded.prefab.shaded.prefab.shaded.org.yaml.snakeyaml
This appears to be happening under the influence of org.basepom.maven.shade.CollectingManifestResourceTransformer which isn't in the stack w/o the basepom
There's a loop that repeatedly calls the same relocator class until the answer stops changing. Workaround is to change the relocated pattern to not contain the original pattern eg
This works:
<relocation>
<pattern>com.google.common</pattern>
<shadedPattern>prefab.shaded.guava</shadedPattern>
</relocation>
This does not:
<relocation>
<pattern>com.google.common</pattern>
<shadedPattern>prefab.shaded.com.google.common</shadedPattern>
</relocation>
Affects: 3.2.3, 3.2.4, 3.3.0, 3.4.0, 3.5.0