【问题标题】:Maven shade-plugin relocation not updating a entry in resource fileMaven 阴影插件重定位不更新资源文件中的条目
【发布时间】:2023-03-30 08:44:01
【问题描述】:

我正在尝试遮蔽aws-java-sdk,以根据here 提到的建议解决库冲突。但是我看到maven-shade-plugin,资源文件(文本)中的条目没有得到更新。例如,request.handler2srequest.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>

【问题讨论】:

    标签: maven amazon-web-services apache-flink maven-shade-plugin aws-java-sdk


    【解决方案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' - 什么版本等?
    猜你喜欢
    • 2019-06-22
    • 1970-01-01
    • 2021-05-01
    • 2012-03-06
    • 2015-07-29
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2019-07-09
    相关资源
    最近更新 更多