3

各モジュールが Apache Felix maven-bundle-plugin を使用して OSGi バンドルとしてパッケージ化されているマルチモジュール プロジェクトがあります。プロジェクト全体は、上記のモジュールをリストする親 POM を使用して構築されます。一部のモジュールには、構成リソース (.properties ファイルなど) が含まれており、展開用にバンドル内でジャーリングするのではなく、専用の構成フォルダーに外部化する必要があります。私の目標は、次のような配布フォルダー (おそらく zip ファイル) を作成することです。

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

    /conf
        external1.properties
        external2.properties
        etc.

ディレクトリの下のプロパティ ファイル/confは、個々のモジュールの/targetフォルダから厳選されたファイルです。.propertiessrc フォルダーではなくターゲット フォルダーからファイルを取得する必要がある理由は、 Maven リソース フィルタリングを使用しており、ソースプロパティ ファイル${..}に環境固有の値のプレースホルダーが含まれているためです。これらのプレースホルダーは、ビルド プロセス中に (ビルド プロファイルごとに) 適切に解決され、target/フォルダーには実際の環境固有の値が含まれます。

私はこのような配布ファイルの操作を何度も行ってきました - 実行可能な JAR を含む配布などのために。この場合、アセンブリ記述子の「moduleSets」構成を使用したかったのです - すべてのバイナリ/jar を単一の配布フォルダに簡単にプルできます。 moduleSet/バイナリ記述子を使用します。特定のファイルを OSGi バンドルにパッケージ化することから除外することも簡単です (maven-bundle-plugin を使用)。私が立ち往生している唯一の問題は、/conf配布フォルダーを作成し、そこに必要なプロパティ ファイルを収集することです。「moduleSet/sources」記述子内で「fileSets」を使用して**/target、各モジュールの特定のファイルのみを含めようとしましたが、うまくいかないようでした。

誰にも提案/アドバイスがありますか?簡単な方法があるはずです。それとも全く使わないほうがいいですか?

ありがとう、

履歴書


@PetrKozelka 異なるバンドルに固有の構成ファイルを別のモジュールに抽出することが良い考えかどうかはわかりません。OSGi の要点は、開発とディストリビューションの両方で、バンドルが独立していて潜在的に再利用可能であることです。ソースコードでは、機能の実装と関連する構成ファイルがグループ化されていることだけが理にかなっています。ただし、特定のディストリビューションでは、管理者が特定のパラメーターを制御する必要がある場合、一部のファイルを抽出する必要がある場合があります。これは、ディストリビューション/アプリケーションによって異なる場合があります。アセンブリ構成は変更される可能性がありますが、バンドル/ソースは同じままです。また、各バンドルは個別に開発および使用される可能性がありますが、すべてのバンドルが常に同じ uber プロジェクトの一部である必要はありません。機能ドメイン/機能別ではなく、アーティファクトのタイプ(「モデル」、「サービス」、「データアクセス」、「構成」など)。このようなアプローチは、単一のアプリケーション/プロジェクト内では問題なく機能しますが、(機能ドメインごとに分割された) 垂直コンポーネントのサブセットを再利用する必要がしばしばあるエンタープライズ レベルでは失敗します。

モジュール内のファイル レイアウトに依存している点については、そのような依存関係があってはならないことに同意します。ファイルは、明示的な名前または命名規則によって厳選することができます - 非常に特定のディストリビューション要件に従って。(これはまさに私が直面しているケースです。)

4

1 に答える 1

5

私は実際にそれを多かれ少なかれエレガントに行う方法を理解しました。他の誰かが同様の問題を解決しようとしている場合に備えて、以下に解決策を投稿してください。

まとめ

を使用してmaven-assembly-plugin、個々のモジュールからバイナリ(バンドルJAR)を抽出し、<my-distribution-folder>/bundlesディレクトリにパッケージ化します。一部のリソースファイルを外部化する必要がある各モジュールでは、そのようなファイルをディレクトリの下に統合し、パッケージ化フェーズ中に、記述子ファイルを含み、一部としてビルドされる専用モジュールの自動生成ディレクトリにそれらのリソースをコピーするために/src/main/resources/external使用しますトッププロジェクトの。親POMで使用して、最上位プロジェクトビルドのCLEANフェーズ中に配布ステージングディレクトリの内容をクリアします。maven-resources-plugindistributionassembly.xmlmaven-clean-plugin

MAVEN CONFIGURATION

外部化する必要のあるリソースを含む各バンドルのモジュールPOM内に、次のリソース管理構成を追加します。

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

注:外部化されたリソースファイルが個々のバンドルJAR内にパッケージ化されないように除外されていることも確認しました(resourcesモジュールPOMのセクションを参照)。結果の解凍されたディストリビューションは次のようになります。

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

  /conf
    external1.properties
    external2.properties
    etc. 
于 2012-11-05T21:08:49.827 に答える