Как я могу объединить файлы ресурсов в сборке Maven? - PullRequest
13 голосов
/ 22 октября 2009

Я использую Maven и его сборочный плагин для создания дистрибутива моего проекта, например так:

  • один проект собирает базовую среду выполнения (на основе Felix) с соответствующими каталогами и пакетами в ZIP-файле.
  • сторонние библиотеки собираются в один проект каждый и либо преобразуются в пакеты OSGi, либо, если они уже совместимы с OSGi, просто копируются
  • Мой собственный проект состоит из нескольких модулей, которые также встроены в комплекты OSGi.

Теперь я добавляю другой проект, который распаковывает ZIP, помещает все остальные JAR-файлы в соответствующие каталоги и перепаковывает его для распространения. Теперь мои пакеты могут содержать файлы конфигурации, которые я хочу объединить, а не заменять файлы с одинаковыми именами в сборке времени выполнения. Как мне это сделать?

Файлы представляют собой обычный текст (файлы свойств), но я мог бы столкнуться с аналогичной ситуацией с файлами XML позже.

Ответы [ 5 ]

24 голосов
/ 04 июля 2012

Расширение немного ответа Юргена для тех, кто наткнулся на это - containerDescriptorHandler в дескрипторе может принимать четыре значения (v2.3), это metaInf-services, file-aggregator, plexus, metaInf-spring , Это немного скрыто в коде (находится в пакете org.apache.maven.plugin.assembly.filter), но возможно объединить файлы конфигурации / свойств.

Вот пример дескриптора, который агрегирует META-INF/services и файлы именованных свойств, расположенные в com.mycompany.actions.

descriptor.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-services и metaInf-spring используются для агрегирования SPI и пружинных конфигурационных файлов соответственно, тогда как обработчик 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

components.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>

и определите имя обработчика в дескрипторе

descriptor.xml

...
<containerDescriptorHandler>
    <handlerName>custom-handler</handlerName>
</containerDescriptorHandler>
...

maven-shade-plugin также может создавать 'uber-jars' и имеет некоторые преобразования ресурсов для обработки XML, лицензий и манифестов.

* +1067 * J
9 голосов
/ 06 декабря 2010

Старый вопрос, но он наткнулся на него, пытаясь решить подобную проблему: плагин 2.2 сборки имеет возможности для объединения файлов: http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html#class_containerDescriptorHandler например handlerName "metaInf-services" (объединяет все файлы META-INF / services), "metaInf-spring" - единственные, которые я знаю (мне лично нужны metaInf-services)

6 голосов
/ 22 октября 2009

Я не знаю надежного решения этой проблемы. Но немного оглядываясь вокруг, показывает, что кто-то создал плагин для объединения файлов свойств. По внешнему виду вы должны указать, какие файлы объединить, и это хорошо, так как вы не хотите, чтобы это применялось, willy nilly.

Предполагая, что для распаковки zip-файла в известное место вы использовали зависимый распаковщик, можно настроить плагин для объединения каждой пары файлов свойств и указать подходящее целевое местоположение.

Вы можете расширить плагин для обработки XML, используя что-то вроде xmlmerge из EL4J, как описано в этой статье Javaworld .

1 голос
/ 07 марта 2011

Я также создал плагин объединения файлов, в моем случае я использую его для объединения файлов SQL из различных проектов в один файл установщика SQL, который может создавать все схемы / таблицы / статические данные и т. Д. Для наших приложений в одном файле, http://croche.googlecode.com/svn/docs/maven-merge-files-plugin/0.1/usage.html

0 голосов
/ 05 сентября 2016

https://github.com/rob19780114/merge-maven-plugin (доступно на Maven Central) также, кажется, делает эту работу. Ниже приведен пример конфигурации

 <plugin>
    <groupId>org.zcore.maven</groupId>
    <artifactId>merge-maven-plugin</artifactId>
    <version>0.0.3</version>
    <executions>
        <execution>
            <id>merge</id>
            <phase>generate-resources</phase>
            <goals>
                <goal>merge</goal>
            </goals>
            <configuration>
              <mergers>
                <merger>
                  <target>${build.outputDirectory}/output-file-1</target>
                  <sources>
                    <source>src/main/resources/file1</source>
                    <source>src/main/resources/file2</source>
                  </sources>
                </merger>
                <merger>
                  <target>${build.outputDirectory}/output-file-2</target>
                  <sources>
                    <source>src/main/resources/file3</source>
                    <source>src/main/resources/file4</source>
                  </sources>
                </merger>
              </mergers>
            </configuration>
        </execution>
    </executions>

...