You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@maven.apache.org by "James Kebinger (Jira)" <ji...@apache.org> on 2023/08/01 00:39:00 UTC

[jira] [Commented] (MSHADE-453) Relocation hangs indefinitely in all releases > 3.2.2 with basepom

    [ https://issues.apache.org/jira/browse/MSHADE-453?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17749376#comment-17749376 ] 

James Kebinger commented on MSHADE-453:
---------------------------------------

I noticed that ManifestResourceTransformer has the same loop until the string stops changing pattern. The unit test can be made to fail (loop endlessly) easily by replacing the second argument to the SimpleRelocator constructor (shadedPattern) "jakarta" with "shaded.javax" on line 84 .

Adding a method in Relocator to do all the replacements at once would seem to be the most straightforward way to address the problem. Calling it iteratively without knowing the pattern would require comparing the previous and new string and sending the next remaining substring to the relocator

> Relocation hangs indefinitely in all releases > 3.2.2 with basepom
> ------------------------------------------------------------------
>
>                 Key: MSHADE-453
>                 URL: https://issues.apache.org/jira/browse/MSHADE-453
>             Project: Maven Shade Plugin
>          Issue Type: Bug
>    Affects Versions: 3.2.3, 3.2.4, 3.3.0, 3.4.0, 3.5.0
>         Environment: Maven home: /Users/jkebinger/Downloads/apache-maven-3.9.3
> Java version: 17.0.1, vendor: BellSoft, runtime: /Users/jkebinger/.asdf/installs/java/liberica-17.0.1+12
> Default locale: en_US, platform encoding: UTF-8
> OS name: "mac os x", version: "13.4.1", arch: "aarch64", family: "mac"
>            Reporter: James Kebinger
>            Priority: Major
>
> 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}}
> {code:java}
> "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){code}
> {{ }}
> Can reproduce on java 11, 17, 19 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
>  
> {code:java}
> public String relocateClass(String clazz) {
> return rawString ? clazz : clazz.replaceFirst(pattern, shadedPattern);
> }{code}
> So it'll start with eg 
>  
> {code:java}
> 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"
>  
> {code}
> 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|https://github.com/basepom/basepom-policy/blob/master/src/main/java/org/basepom/maven/shade/CollectingManifestResourceTransformer.java#L196-L207]  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>



--
This message was sent by Atlassian Jira
(v8.20.10#820010)