gpt4 book ai didi

maven-2 - 如何在 Maven 程序集中合并资源文件?

转载 作者:行者123 更新时间:2023-12-03 21:07:02 24 4
gpt4 key购买 nike

我正在使用 Maven 及其程序集插件来构建我的项目的分发包,如下所示:

  • 一个项目在 ZIP 文件中组装了一个基本运行时(基于 Felix),以及适当的目录和包。
  • 第三方库分别收集在一个项目中,或者转换为 OSGi 包,或者,如果它们已经与 OSGi 兼容,则直接复制它们
  • 我自己的项目也包含几个内置于 OSGi 包中的模块。

  • 现在,我添加了另一个项目,它解压缩 ZIP,将所有其他 JAR 放入正确的目录,然后重新打包以进行分发。现在,我的包可能包含我想要合并到而不是替换运行时程序集中同名的配置文件。我怎么做?

    这些文件是纯文本(属性文件),但稍后我可能会遇到与 XML 文件类似的情况。

    最佳答案

    为偶然发现此问题的人扩展 Juergen 的答案 - containerDescriptorHandler在描述符中可以取四个值(v2.3),这些是metaInf-services , file-aggregator , plexus , metaInf-spring .它有点隐藏在代码中(在包 org.apache.maven.plugin.assembly.filter 中找到),但可以聚合配置/属性文件。

    这是一个聚合 META-INF/services 的示例描述符。和
    位于 com.mycompany.actions 中的命名属性文件.

    描述符.xml

    <assembly>

    ...

    <containerDescriptorHandlers>

    <containerDescriptorHandler>
    <handlerName>metaInf-services</handlerName>
    </containerDescriptorHandler>

    <containerDescriptorHandler>
    <handlerName>file-aggregator</handlerName>
    <configuration>
    <filePattern>com/mycompany/actions/action.properties</filePattern>
    <outputPath>com/mycompany/actions/action.properties</outputPath>
    </configuration>
    </containerDescriptorHandler>

    </containerDescriptorHandlers>

    ....

    </assembly>
    file-aggregator filePattern 中可以包含正则表达式匹配多个文件。以下将匹配所有文件名“action.properties”。
    <filePattern>.+/action.properties</filePattern>
    metaInf-servicesmetaInf-spring用于聚合 SPI和 spring 配置文件,而 plexus处理程序将聚合 META-INF/plexus/components.xml一起。

    如果您需要更专业的东西,您可以通过实现 ContainerDescriptorHandler 添加自己的配置处理程序。并在 META-INF/plexus/components.xml 中定义组件.您可以通过创建一个依赖于 maven-assembly-plugin 的上游项目来做到这一点。并包含您的自定义处理程序。可能可以在您正在组装的同一个项目中执行此操作,但我没有尝试过。处理程序的实现可以在 org.apache.maven.plugin.assembly.filter.* 中找到。汇编源代码包。

    CustomHandler.java
    package com.mycompany;

    import org.apache.maven.plugin.assembly.filter.ContainerDescriptorHandler;

    public class CustomHandler implements ContainerDescriptorHandler {
    // body not shown
    }

    然后在 /src/main/resources/META-INF/plexus/components.xml 中定义组件

    组件.xml
    <?xml version='1.0' encoding='UTF-8'?>
    <component-set>
    <components>
    <component>
    <role>org.apache.maven.plugin.assembly.filter.ContainerDescriptorHandler</role>
    <role-hint>custom-handler</role-hint>
    <implementation>com.mycompany.CustomHandler</implementation>
    <instantiation-strategy>per-lookup</instantiation-strategy>
    </component>
    </components>
    </component-set>

    最后,您将其添加为对要组装的项目中的组装插件的依赖项

    pom.xml
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2.1</version>
    <configuration>
    <descriptors>
    <descriptor>...</descriptor>
    </descriptors>
    </configuration>
    <dependencies>
    <dependency>
    <groupId>com.mycompany</groupId>
    <artifactId>sample-handler</artifactId>
    <version>1.0</version>
    </dependency>
    </dependencies>
    </plugin>

    并在描述符中定义 handlerName

    描述符.xml
    ...
    <containerDescriptorHandler>
    <handlerName>custom-handler</handlerName>
    </containerDescriptorHandler>
    ...

    maven-shade-plugin还可以创建 'uber-jars' 并具有一些用于处理 XML、许可证和 list 的资源转换。

    Ĵ

    关于maven-2 - 如何在 Maven 程序集中合并资源文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1607220/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com