Maven 阴影插件重定位不更新资源文件中的条目
Posted
技术标签:
【中文标题】Maven 阴影插件重定位不更新资源文件中的条目【英文标题】:Maven shade-plugin relocation not updating a entry in resource file 【发布时间】:2018-05-08 15:40:58 【问题描述】:我正在尝试遮蔽aws-java-sdk,以根据here 提到的建议解决库冲突。但是我看到maven-shade-plugin,资源文件(文本)中的条目没有得到更新。例如,request.handler2s 和 request.handlers 的内容不会按照重定位模式进行更改。
maven-shade-plugin 可以更新这些文件(资源文件)吗?如果没有,还有什么其他选择?
pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<relocations>
<relocation>
<pattern>com.amazonaws</pattern>
<shadedPattern>com.XX.YY.shaded.com.amazonaws</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
【问题讨论】:
【参考方案1】:您可以尝试将 ServiceResourceTransformer 添加到您的配置中:
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
【讨论】:
尝试将 shade-plugin 版本更新到 3.0.0,以前的版本存在重定位服务的已知问题。 org.apache.maven.plugins.shade.resource.ServicesResourceTransformer 仅重定位 META-INF/services 下的文件。 AWS resource.handler 文件位于不同的路径 (com/amazonaws/services/sqs/resource.handler)。有没有人在搬迁期间有改变这个文件的解决方案?面临同样的问题。谢谢。 @popcoder,你有解决这个问题的办法吗?努力解决这个问题。【参考方案2】:我在 gradle 中遇到过同样的问题。太糟糕了,用 maven 实现内联修复并不容易。下面是我添加到我的 build.gradle 的代码,以允许我正确地遮蔽 com.amazonaws:
shadowJar
zip64 true
mergeServiceFiles()
relocate('com.amazonaws', 'shaded.com.amazonaws')
transform(RelocateAmazonawsServiceRequestHandlers.class)
import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer
import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext
import shadow.org.apache.tools.zip.ZipOutputStream
import shadow.org.apache.tools.zip.ZipEntry
class RelocateAmazonawsServiceRequestHandlers implements Transformer
private Map<String, String> transformedResources = new HashMap<>()
@Override
boolean canTransformResource(FileTreeElement fileTreeElement)
return (fileTreeElement.getName() ==~ /com\/amazonaws\/services\/.*\/request.handlers/)
@Override
void transform(TransformerContext transformerContext)
String text = transformerContext.is.text
transformerContext.relocators.each
r -> text = r.applyToSourceContent(text)
transformedResources.put(transformerContext.path, text)
@Override
boolean hasTransformedResource()
return transformedResources.size() > 0
@Override
void modifyOutputStream(ZipOutputStream zipOutputStream)
transformedResources.each key, value ->
zipOutputStream.putNextEntry(new ZipEntry(key))
zipOutputStream.write(value.getBytes())
zipOutputStream.flush()
【讨论】:
对我不起作用。你能分享文件的全部内容吗?您的代码缺少一些基本要素作为版本,例如您如何导入 id 'com.github.johnrengelman.shadow' - 什么版本等?以上是关于Maven 阴影插件重定位不更新资源文件中的条目的主要内容,如果未能解决你的问题,请参考以下文章
Maven原型插件不允许原型资源中的.resources通过