2

私はこれが推奨される方法ではないことを知っており、以下を読みました:

http://www.sonatype.com/people/2010/01/how-to-create-two-jars-from-one-project-and-why-you-shouldnt/

私は同意します。しかし、現在、次の問題を解決する必要があります。

複数の src フォルダー A および B を含むプロジェクトがあります (build-helper-maven-plugin を使用)。対応する 2 つの jar A (デフォルトの jar) と B を作成する必要があります。Jar A には src フォルダー A のクラスが含まれ、jar B には src フォルダー B のクラスが含まれます。

まず、デフォルトの jar A を作成し、src フォルダー B からすべてのクラスを除外しようとします。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <executions>
                <execution>
                    <id>default-jar</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <excludes>
                            <exclude>**/B*</exclude>
                        </excludes>
                    </configuration>
                </execution> 

しかし、A jar を調べると、ソース フォルダー B のパッケージのクラスが含まれています。

以下の回答に基づいて、私は今やっています:

<properties>
    <artifactId.model>${project.artifactId}-model-${project.version}</artifactId.model>
    <artifactId.default>${project.artifactId}-${project.version}</artifactId.default>
</properties>

        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.3</version>
            <executions>
                <execution>
                    <id>make-model-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <appendAssemblyId>false</appendAssemblyId>
                        <finalName>${artifactId.model}</finalName>
                        <descriptors>
                            <descriptor>src/main/assembly/model.xml</descriptor>
                        </descriptors>
                        <attach>true</attach>
                    </configuration>
                </execution>
                <execution>
                    <id>make-default-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <appendAssemblyId>false</appendAssemblyId>
                        <finalName>${artifactId.default}</finalName>
                        <descriptors>
                            <descriptor>src/main/assembly/default.xml</descriptor>
                        </descriptors>
                        <attach>true</attach>
                    </configuration>
                </execution>
            </executions>
        </plugin>

モデルの記述子は次のとおりです。

<assembly>
    <id>model</id>
    <formats>
        <format>jar</format>
    </formats>
    <baseDirectory>target</baseDirectory>
    <includeBaseDirectory>false</includeBaseDirectory>

    <fileSets>
        <fileSet>
            <directory>${basedir}/model_a</directory>
            <includes>
                <include>**/**</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${basedir}/model_b</directory>
            <includes>
                <include>**/**</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

次に、build-helper を使用して jar をアタッチします。上記の問題は明らかに、コンパイルされた .class ファイルではなく .java ファイルを取得することです。すべての .class ファイルはすべてのソース フォルダーの同じターゲット/クラス フォルダーにあるため (noahz のコメントを参照)、関連するパッケージの各 include/exclude を手動で指定する必要があります。サブプロジェクトを作成するのが最善の方法です。

4

2 に答える 2

0

これは私が与えた答えのほぼコピーです:

アセンブリ プラグインのさまざまな実行を使用して、結果のアセンブリをビルドにアタッチできます。もちろん、アセンブリ プラグイン構成で成果物に異なる最終名を構成する必要があります。アセンブリ記述子では、何を含めるかを構成する必要があります。

于 2012-10-08T15:08:00.693 に答える
0

はい、Jar プラグインのinclude/excludeは、元のソース ファイルの物理的な場所を考慮しないパッケージ用です。

このプロジェクトを 2 つの子モジュールに分割することを検討してください。

代替アプローチ

私がよく言うように、ビルド要件の 90% には Maven があります。他のすべてについては、Antrun Plugin があります。

パラメータを利用して、Ant Jar Taskを使用して jar を生成する必要がありincludesfileます。このファイルは、ハードコーディングするか、ビルド時に実行するスクリプトから生成することができます (つまりfind、各ソース ディレクトリの下のすべてのファイルとインクルード ファイルへの出力)。

最善の解決策ではありませんが、目標を達成する必要があります (ただし、2 つの子モジュールの方が簡単です)。

于 2012-10-08T15:03:22.570 に答える