[ 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)