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 阴影插件重定位不更新资源文件中的条目的主要内容,如果未能解决你的问题,请参考以下文章

带有 JDA 的 Maven 阴影插件

Maven原型插件不允许原型资源中的.resources通过

Maven 发布插件不更新依赖管理中的快照

修改Maven本地资源库位置

使用 Spring Boot Maven 插件时,jar 文件中缺少 Spring Boot 应用程序中的资源

maven常用插件配置