Skip to content

[MSHADE-453] Relocation hangs indefinitely in all releases > 3.2.2 with basepom #478

Open
@jira-importer

Description

@jira-importer

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingpriority:criticalCrashes, loss of data, severe memory leak

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions