18

Maven アセンブリ プラグインを使用してアプリケーション アーカイブを作成します。私のpomに存在するすべての依存関係は問題なく含まれています。

ここで、同じアーティファクトの 2 つ以上のバージョンを含める必要があります。

私のポンに私が入れた場合

<dependencies>
        [...]
        <dependency>
            <groupId>db.test</groupId>
            <artifactId>my-model</artifactId>
            <version>1.0.3</version>
        </dependency>
        <dependency>
            <groupId>db.test</groupId>
            <artifactId>my-model</artifactId>
            <version>1.1.0</version>
        </dependency>
</dependencies>

ソースの依存関係リゾルバーは古いバージョンを削除し、1.1.0 のみがアーカイブにパッケージ化されています

アセンブリ xml 記述子ファイルを使用して、jar を含めようとしています。そして、私は解決策を見つけられませんでした。

考えられる解決策は、必要なすべての model.jar をフォルダー内に手動で配置し、アセンブリにそれをアーカイブにコピーするように指示することです。しかし、より構成可能なソリューションを探しています。

何か案が ?

4

4 に答える 4

13

maven-dependency-pluginを使用して、解決されたpom依存関係と追加のjarをコピーすることで解決策を見つけました。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.1</version>
<executions>
    <execution>
        <id>copy-dependencies</id>
        <phase>package</phase>
        <goals>
            <goal>copy-dependencies</goal>
        </goals>
        <configuration>
            <outputDirectory>${project.build.directory}/lib</outputDirectory>
            <overWriteReleases>false</overWriteReleases>
            <overWriteSnapshots>false</overWriteSnapshots>
            <overWriteIfNewer>true</overWriteIfNewer>
            <includeScope>runtime</includeScope>
        </configuration>
    </execution>
    <execution>
        <id>copy-model</id>
        <phase>package</phase>
        <goals>
            <goal>copy</goal>
        </goals>
        <configuration>
            <artifactItems>
                <artifactItem>
                    <groupId>my.test.pkg</groupId>
                    <artifactId>my-model</artifactId>
                    <classifier>server</classifier>
                    <version>1.0.3</version>
                    <type>jar</type>
                </artifactItem>
                <artifactItem>
                    <groupId>my.test.pkg</groupId>
                    <artifactId>my-model</artifactId>
                    <classifier>server</classifier>
                    <version>1.1.0</version>
                    <type>jar</type>
                </artifactItem>
            </artifactItems>
            <outputDirectory>${project.build.directory}/lib</outputDirectory>
        </configuration>
    </execution>
</executions>

これで、アセンブリxmlに次の行を追加する必要があります

    <fileSet>
        <directory>${project.build.directory}/lib</directory>
        <outputDirectory>/lib</outputDirectory>
        <filtered>false</filtered>
        <includes>
            <include>*.jar</include>
        </includes>
        <fileMode>0600</fileMode>
    </fileSet>
于 2010-11-30T14:11:14.177 に答える
12

Maven では、一度に複数のバージョンのモジュールを使用しても意味がないと想定しています。新しいバージョンが古いバージョンを置き換えることを前提としています。そうでない場合は、同じモジュールではありません。新しいモジュールには別の名前を付けて、ランダムなモジュールを選択しないように別のパッケージがあることを確認することをお勧めします。

一般に、Maven は優れたアプリケーション設計を奨励しようとし、悪い考えであると判断したことを意図的に実行しにくくしています。

于 2010-11-30T10:25:23.887 に答える
1

バージョンが異なるということは、古いバージョンを置き換えることを意味することに同意します。ビジネス要件のために、2 つの異なるバージョンの Web サービスを使用する必要がある場合。別のパッケージでスタブを生成することをお勧めします。maven に追加する際に、別のパッケージを で指定できますgroupid。これはうまくいくはずです。

于 2016-02-10T17:50:36.443 に答える
1

もう 1 つの厄介な解決策は、WAR ファイル オーバーレイを使用することです。このメカニズムは、オーバーレイを適用するときにコンポーネント JAR ファイルのバージョンに注意を払わないという事実を利用します。

于 2010-11-30T12:58:37.873 に答える