3

У меня есть проект с несколькими модулями, где каждый модуль упакован как пакет OSGi, используя Apache Felix maven-bundle-plugin. Весь проект построен с использованием родительского ПОМ, в котором перечислены вышеупомянутые модули. Некоторые модули содержат ресурсы конфигурации (например, файлы .properties), которые не должны быть помещены внутри пакетов для развертывания, а скорее экстернализированы в отдельной папке конфигурации. Моя цель состоит в том, чтобы создать папку распределения (возможно, почтовый файл), который будет выглядеть примерно так:Создание дистрибутива пакетов OSGi с помощью maven-assembly-plugin

my-app-distribution 
    /bundles 
     module1-bundle.jar 
     module2-bundle.jar 
     etc. 

    /conf 
     external1.properties 
     external2.properties 
     etc. 

где файлы свойств в директории /conf собираются вручную файлы из /target папок отдельных модулей. Причина, по которой файлы .properties необходимо подбирать из целевых папок по сравнению с папками src, заключается в том, что я использую фильтрацию ресурсов Maven, а файлы свойств источника содержат ${..} заполнители для значений, зависящих от среды. Эти заполнители правильно разрешаются во время процесса сборки - для профилей сборки, а папки target/ содержат фактические значения, зависящие от конкретной среды.

Я делал такие манипуляции с файлами распределения много раз - для дистрибутивов с исполняемыми JAR и т. Д. В этом случае я хотел использовать конфигурацию «modulesSets» дескриптора сборки - легко вытащить все двоичные файлы/банки в одну папку распространения, используя moduleSet/двоичный дескриптор. Также легко исключить некоторые файлы из упаковки в пакет OSGi - в плагин maven-bundle. Единственная проблема, за которую я застрял, - создать папку распространения /conf и собрать необходимые файлы свойств там. Я попытался использовать «filesSets» внутри дескриптора «modulesSet/sources», чтобы включать только определенные файлы из **/target каждого модуля, но это, похоже, не работает.

У кого-нибудь есть предложение/совет? Там должен быть простой способ. Или я вообще не должен использовать?

Спасибо,

CV


@PetrKozelka Я не уверен, что извлечение файлов конфигурации специфичны для различных пучков в отдельный модуль является хорошей идеей. Весь смысл OSGi заключается в том, чтобы связки были независимыми и потенциально многоразовыми - как в разработке, так и в дистрибутивах. Имеет смысл только то, что - в исходном коде - реализация функциональности и связанные файлы конфигурации сгруппированы. Для конкретного распространения, хотя мне может понадобиться извлечь некоторые из файлов - если есть требование, чтобы администраторы имели контроль над определенными параметрами. Это может быть разным для другого дистрибутива/приложения. Конфигурация сборки может измениться, но связки/источники останутся неизменными. Кроме того, каждый пучок потенциально может разрабатываться и использоваться отдельно, а не все пакеты всегда должны быть частью одного и того же проекта uber - как вы, кажется, предполагаете. То, что вы предлагаете, похоже, попадает в одну и ту же старую категорию упаковочных корпоративных приложений по типам артефактов (например, «модель», «услуги», «доступ к данным», «конфиг» и т. Д.), А не функциональным доменом/функциями , Такой подход работает нормально в рамках одного приложения/проекта, но не работает на уровне предприятия, где часто возникает необходимость повторно использовать подмножества вертикальных компонентов (разделенных функциональными доменами).

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

+0

Не рекомендуется брать файлы с субмодулей напрямую, так как они подвержены ошибкам - особенно при изменении формата файла и т. Д. Обычно лучше присоединить конфигурацию в качестве вторичного артефакта вывода с определенным типом и классификатор, а затем использовать его как зависимость. В вашем случае, возможно, имеет смысл иметь один модуль для обработки всех конфигураций или поместить его в дистрибутивный модуль. –

ответ

5

Я действительно понял, как это сделать более или менее элегантно.Публикация решения ниже в случае, если кто-то ищет решение аналогичной проблемы.

РЕЗЮМЕ

Я использую maven-assembly-plugin для извлечения двоичных файлов (расслоение баночек) из отдельных модулей и упаковать их в каталоге <my-distribution-folder>/bundles. В каждом модуле, где некоторые файлы ресурсов должны быть внешними, я объединяю такие файлы в каталоге /src/main/resources/external и использую maven-resources-plugin для копирования этих ресурсов во время фазы упаковки в автоматически сгенерированный каталог в моем выделенном модуле distribution, который содержит файл дескриптора assembly.xml и также построенный как часть верхнего проекта. Я использую maven-clean-plugin в родительском POM, чтобы очистить содержимое каталога промежуточной дистрибуции во время фазы CLEAN сборки проекта верхнего уровня.

MAVEN КОНФИГУРАЦИЯ

Внутри модуль П каждого пучка, что содержит ресурсы, которые должны быть экстернализировано добавить следующую конфигурацию управления ресурсами:

<build> 
    <defaultGoal>install</defaultGoal> 

    <!-- 
    enable resource filtering for resolving ${...} placeholders with environment-specific values 
    exclude any files that must be externalized 
    --> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
      <excludes> 
       <exclude>external/*.*</exclude> 
      </excludes> 
     </resource> 
    </resources> 
    ... 

    <plugins> 
     <!-- Copies contents of resources/external to dedicated folder defined by property in parent --> 
     <!-- externalized resources will be packaged according to assembly instructions --> 
     <plugin> 
      <artifactId>maven-resources-plugin</artifactId> 
      <version>2.6</version> 
      <executions> 
       <execution> 
        <id>copy-resources</id> 
        <phase>package</phase> 
        <goals> 
         <goal>copy-resources</goal> 
        </goals> 
        <configuration> 
         <outputDirectory> 
          ${project.parent.basedir}/${externalizableResourcesStageDir} 
         </outputDirectory> 
         <resources> 
          <resource> 
           <directory>src/main/resources/external</directory> 
           <filtering>true</filtering> 
          </resource> 
         </resources> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

     <!-- builds a JAR file for this bundle --> 
     <plugin> 
      <groupId>org.apache.felix</groupId> 
      <artifactId>maven-bundle-plugin</artifactId> 
      <extensions>true</extensions> 
      <configuration> 
       <instructions> 
        <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName> 
        <Import-Package>*</Import-Package> 
        <Export-Package> 
         ${project.groupId}.thismodulepackage*;version=${project.version} 
        </Export-Package> 
       </instructions> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

где externalizableResourcesStageDir это свойство, определенное в верхнем/родительский POM. В проекте, я включил специальный модуль распределения со следующей структурой:

distribution 
    /ext-resources (target auto-generated dir for external resources from modules) 
    /src 
     /assemble 
      assembly.xml (assembly descriptor) 

Файл assembly.xml выглядит следующим образом:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 
     http://maven.apache.org/xsd/assembly-1.1.2.xsd"> 
<id>bin</id> 

<!-- generate a ZIP distribution --> 
<formats> 
    <format>zip</format> 
</formats> 
<includeBaseDirectory>false</includeBaseDirectory> 
<baseDirectory>/</baseDirectory> 

<moduleSets> 
    <moduleSet> 
     <!-- Enable access to all projects in the current multi-module build --> 
     <useAllReactorProjects>true</useAllReactorProjects> 

     <!-- select projects to include--> 
     <includes> 
      <include>myGroupId:myModuleArtifactId1</include> 
      <include>myGroupId:myModuleArtifactId2</include> 
      ... 
     </includes> 

     <!-- place bundle jars under /bundles folder in dist directory --> 
     <binaries> 
      <outputDirectory>${artifactId}/bundles</outputDirectory> 
      <unpack>false</unpack> 
     </binaries> 
    </moduleSet> 
</moduleSets> 

<!-- now take files from ext-resources in this module and place them into dist /conf subfolder--> 
<fileSets> 
    <fileSet> 
     <directory>ext-resources</directory> 
     <outputDirectory>${artifactId}/conf/</outputDirectory> 
     <includes> 
      <include>*</include> 
     </includes> 
    </fileSet> 

</fileSets> 

</assembly> 

POM модуль рассылки была бы выглядеть следующим образом:

<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 

<parent> 
    <groupId>myGroupId</groupId> 
    <artifactId>parentArtifactId</artifactId> 
    <version>...</version> 
</parent> 

<groupId>myGroupId</groupId> 
<artifactId>distribution</artifactId> 
<version>...</version> 

<packaging>pom</packaging> 
<name>Distribution</name> 
<description>This module creates the <MyProject> Distribution Assembly</description> 
<url>http:...</url> 

<!-- NOTE: These dependency declarations are only required to sort this project to the 
    end of the line in the multi-module build. 
--> 
<dependencies> 
    <dependency> 
     <groupId>myGroupId</groupId> 
     <artifactId>myModuleArtifactId1</artifactId> 
     <version>${project.version}</version> 
    </dependency> 
... 
</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>dist-assembly</id> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
        <configuration> 
         <descriptors> 
          <descriptor>src/assemble/assembly.xml</descriptor> 
         </descriptors> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

    </plugins> 
</build> 
</project> 

Родительский POM будет перечислять все модули пакета, а также модуль распределения, а также определять плагин сборки:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>myGroupId</groupId> 
    <artifactId>myParentId</artifactId> 
    <version>...</version> 
    <packaging>pom</packaging> 

    <properties> 
     ... 

     <!-- directory where build may place any sub-modules' resources that should be externalized --> 
     <!-- those resources may be picked up by maven-assembly-plugin and packaged properly for distribution --> 
     <externalizableResourcesStageDir> 
      esb-distribution/ext-resources 
     </externalizableResourcesStageDir> 

    </properties> 

    <!-- all project modules (OSGi bundles + distribution) --> 
    <modules> 
     <module>bundle-module1</module> 
     <module>bundle-module2</module> 
     ... 
     <module>distribution</module> 
    </modules> 



    <dependencyManagement> 
     <dependencies> 
     ... 
     </dependencies> 
    </dependencyManagement> 

    <build> 
     <pluginManagement> 
      <plugins> 
       <!-- 
       Cleans contents of the folder where the externalized resources will be consolidated 
       Each module adds its own external files to the distribution directory during its own build 
       --> 
       <plugin> 
        <artifactId>maven-clean-plugin</artifactId> 
        <version>2.5</version> 
        <executions> 
         <execution> 
          <id>clean-ext-resources</id> 
          <phase>clean</phase> 
         </execution> 
        </executions> 
        <configuration> 
         <filesets> 
          <fileset> 
           <directory>${externalizableResourcesStageDir}</directory> 
           <includes> 
            <include>*.*</include> 
           </includes> 
           <followSymlinks>false</followSymlinks> 
          </fileset> 
         </filesets> 
        </configuration> 
       </plugin> 


       <plugin> 
        <artifactId>maven-assembly-plugin</artifactId> 
        <version>2.3</version> 
        <configuration> 
         <descriptors> 
          <descriptor>src/assemble/assembly.xml</descriptor> 
         </descriptors> 
        </configuration> 
       </plugin> 
      </plugins> 
     </pluginManagement> 
    </build> 

</project> 

ПРИМЕЧАНИЯ: Мы также убедились, что экстернализованные файлы ресурсы исключены из упаковано внутри отдельных банок пучка (см resources раздела модуля П.) В результате распакованное распределения будет выглядеть следующим образом: