[ 
https://issues.apache.org/jira/browse/MSHADE-452?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

hk__lrzy updated MSHADE-452:
----------------------------
    Description: 
We have java path as below
_*org.apache.demo1*_

_*org.apache.demo2*_

In {_}*maven-shade-plugin 3.2.1*{_}, we use relocation to process path and SPI 
Service file at the same time, and we will follow result.
{code:java}
<relocation>
    <pattern>org.apache.demo</pattern>
    <shadedPattern>shaded.org.apache.demo</shadedPattern>
</relocation> {code}
{code:java}
META-INF/services/shaded.org.apache.demo{code}
But in _*maven-shaded-plugin 3.5.0,*_ it can't work as before, alouthght it SPI 
file name alao could be changed, but the SPI file content will {_}*have no 
change*{_}.

I see the differneces between the _*maven-shaded-plugin 3.5.0 and 
maven-shaded-plugin 3.2.1,*_ finally find in _*maven-shaded-plugin 3.2.1,*_ 
file content changed by follow code

 
{code:java}
public String applyToSourceContent( String sourceContent )
{
    if ( rawString )
    {
        return sourceContent;
    }
    else
    {
        return sourceContent.replaceAll( "\\b" + pattern, shadedPattern );
    }
}{code}
but in {_}*maven-shaded-plugin 3.5.0*{_}, _**_ the code change to 
{code:java}
private String shadeSourceWithExcludes( String sourceContent, String 
patternFrom, String patternTo,
                                        Set<String> excludedPatterns )
{
    // Usually shading makes package names a bit longer, so make buffer 10% 
bigger than original source
    StringBuilder shadedSourceContent = new StringBuilder( 
sourceContent.length() * 11 / 10 );
    boolean isFirstSnippet = true;
    // Make sure that search pattern starts at word boundary and we look for 
literal ".", not regex jokers
    for ( String snippet : sourceContent.split( "\\b" + patternFrom.replace( 
".", "[.]" + "\\b" ) ) )
    {
        boolean doExclude = false;
        for ( String excludedPattern : excludedPatterns )
        {
            if ( snippet.startsWith( excludedPattern ) )
            {
                doExclude = true;
                break;
            }
        }
        if ( isFirstSnippet )
        {
            shadedSourceContent.append( snippet );
            isFirstSnippet = false;
    }
        else
        {
            shadedSourceContent.append( doExclude ? patternFrom : patternTo 
).append( snippet );
        }
    }
    return shadedSourceContent.toString();
} {code}
In my cases, source content is {_}*org.apache.demo1*{_}, pattern from is 
{_}*org.apache.demo*{_}, pattern to is _*shaded.org.apache.demo.*_

and the code _*sourceContent.split( "\\b" + patternFrom.replace( ".", "[.]" + 
"\\b" ) )*_ __ will only have one response.

 

  was:
We have java path as below
_*org.apache.demo1*_

_*org.apache.demo2*_

In {_}*maven-shade-plugin 3.2.1*{_}, we use relocation to process path and SPI 
Service file at the same time, and we will follow result.
{code:java}
<relocation>
    <pattern>org.apache.demo</pattern>
    <shadedPattern>shaded.org.apache.demo</shadedPattern>
</relocation> {code}
{code:java}
META-INF/services/shaded.org.apache.demo{code}


> Shade plugin can't replace SPI content with correct
> ---------------------------------------------------
>
>                 Key: MSHADE-452
>                 URL: https://issues.apache.org/jira/browse/MSHADE-452
>             Project: Maven Shade Plugin
>          Issue Type: Improvement
>    Affects Versions: 3.5.0
>            Reporter: hk__lrzy
>            Priority: Critical
>         Attachments: 20230720-205856.png, 20230720-205900.png, 
> image-2023-07-20-21-03-36-444.png
>
>
> We have java path as below
> _*org.apache.demo1*_
> _*org.apache.demo2*_
> In {_}*maven-shade-plugin 3.2.1*{_}, we use relocation to process path and 
> SPI Service file at the same time, and we will follow result.
> {code:java}
> <relocation>
>     <pattern>org.apache.demo</pattern>
>     <shadedPattern>shaded.org.apache.demo</shadedPattern>
> </relocation> {code}
> {code:java}
> META-INF/services/shaded.org.apache.demo{code}
> But in _*maven-shaded-plugin 3.5.0,*_ it can't work as before, alouthght it 
> SPI file name alao could be changed, but the SPI file content will {_}*have 
> no change*{_}.
> I see the differneces between the _*maven-shaded-plugin 3.5.0 and 
> maven-shaded-plugin 3.2.1,*_ finally find in _*maven-shaded-plugin 3.2.1,*_ 
> file content changed by follow code
>  
> {code:java}
> public String applyToSourceContent( String sourceContent )
> {
>     if ( rawString )
>     {
>         return sourceContent;
>     }
>     else
>     {
>         return sourceContent.replaceAll( "\\b" + pattern, shadedPattern );
>     }
> }{code}
> but in {_}*maven-shaded-plugin 3.5.0*{_}, _**_ the code change to 
> {code:java}
> private String shadeSourceWithExcludes( String sourceContent, String 
> patternFrom, String patternTo,
>                                         Set<String> excludedPatterns )
> {
>     // Usually shading makes package names a bit longer, so make buffer 10% 
> bigger than original source
>     StringBuilder shadedSourceContent = new StringBuilder( 
> sourceContent.length() * 11 / 10 );
>     boolean isFirstSnippet = true;
>     // Make sure that search pattern starts at word boundary and we look for 
> literal ".", not regex jokers
>     for ( String snippet : sourceContent.split( "\\b" + patternFrom.replace( 
> ".", "[.]" + "\\b" ) ) )
>     {
>         boolean doExclude = false;
>         for ( String excludedPattern : excludedPatterns )
>         {
>             if ( snippet.startsWith( excludedPattern ) )
>             {
>                 doExclude = true;
>                 break;
>             }
>         }
>         if ( isFirstSnippet )
>         {
>             shadedSourceContent.append( snippet );
>             isFirstSnippet = false;
>     }
>         else
>         {
>             shadedSourceContent.append( doExclude ? patternFrom : patternTo 
> ).append( snippet );
>         }
>     }
>     return shadedSourceContent.toString();
> } {code}
> In my cases, source content is {_}*org.apache.demo1*{_}, pattern from is 
> {_}*org.apache.demo*{_}, pattern to is _*shaded.org.apache.demo.*_
> and the code _*sourceContent.split( "\\b" + patternFrom.replace( ".", "[.]" + 
> "\\b" ) )*_ __ will only have one response.
>  



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

Reply via email to