14

目標はtar.gz、リポジトリから最新のアーティファクトを取得し、特定の場所に解凍することです。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.5.1</version>
            <executions>
                <execution>
                    <phase>generate-resources</phase>
                    <goals>
                        <goal>unpack</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>com.enterprise</groupId>
                                <artifactId>skrillex</artifactId>
                                <version>${product.version}</version>
                                <type>tar.gz</type>
                                <outputDirectory>target/product</outputDirectory>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>

もあります

<dependencies>
    <dependency>
        <groupId>com.enterprise</groupId>
        <artifactId>skrillex</artifactId>
        <version>${product.version}</version>
        <type>tar.gz</type>
    </dependency>
</dependencies>

しかし、エラーが発生します:

[INFO] --- maven-dependency-plugin:2.5.1:unpack (unpack-unix) @ ... ---
[INFO] Configured Artifact: com.enterprise:skrillex:[1.1.70,):tar.gz
Downloading: https://repo/com/enterprise/skrillex/[1.1.70,)/skrillex-[1.1.70,).tar.gz

...

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-dependency-plugin:2.5.1:unpack (unpack-unix) on project ...: Unable to resolve artifact. Could not transfer artifact com.enterprise:skrillex:tar.gz:[1.1.70,) from/to ext (repo....): IllegalArgumentException
4

4 に答える 4

14

注: 以下はテストされていませんが、動作するはずです

OK、ここでの問題は、<artifactItem>バージョン範囲が解決されないことです。

あなたがする必要があるのは、からdependency:unpackに切り替えることですdependency:unpack-dependencies

例えば

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.5.1</version>
        <executions>
            <execution>
                <phase>generate-resources</phase>
                <goals>
                    <goal>unpack-dependencies</goal>
                </goals>
                <configuration>
                    <includeTypes>tar.gz</includeTypes>
                    <includeArtifactIds>skrillex</includeArtifactIds>
                    <outputDirectory>target/product</outputDirectory>
                </configuration>
            </execution>
        </executions>
    </plugin>

(他の人がフォローしている場合は、依存関係を追加して、タイプを確実に指定する必要があります。

<dependencies>
    <dependency>
        <groupId>com.enterprise</groupId>
        <artifactId>skrillex</artifactId>
        <version>${product.version}</version>
        <type>tar.gz</type>
    </dependency>
</dependencies>

)

これにより、Maven が確実に範囲を解決し、ファイル タイプがクラスパスと互換性がないため、このアーティファクトの推移的なクラスパスに依存関係がなくなります。

クラスパスと互換性のある依存.jar関係 (依存関係など)、またはそのように処理できる依存関係 (a 内の依存関係など) を使用.zipしてこれを行っている場合は、依存関係にまたは.warを追加して、推移的な依存関係ツリーが汚染されないようにする必要があります。 .<scope>test</scope><optional>true</optional>

潜在的な問題

注意が必要な点がいくつかあります。

  • Maven 2.x は、リモート リポジトリ内のサイド アーティファクトの存在を追跡しません。そのため、.tar.gzすべてのバージョン (またはより重要なすべての-SNAPSHOTバージョン) にアタッチされていない場合、アーティファクトが見つからないという結果になる可能性があります。

  • Maven 3.x はサイド アーティファクトの存在を追跡しますmaven-metadata.xmlが、IIRC は-SNAPSHOTバージョンに対してのみ追跡します。これは、「部分的な」スナップショットを展開する場合でも、最新のサイド アーティファクトをすべて解決できるという考え方です (最新のものが-SNAPSHOT同じ方向の古いものであったとしても)。バージョン

  • バージョン範囲を使用することは、本当に悪い計画です。アップストリームの更新設定に従って範囲が解決されるため、プロジェクトのダウンストリーム コンシューマに苦痛の世界がもたらされます<repositories>。再考して修正版を使用してください。

于 2013-06-06T16:11:29.263 に答える
1

これは、maven 依存関係プラグインの既知の問題です: http://jira.codehaus.org/browse/MDEP-50

一般に、変数の依存関係のバージョンが好きな人はいません。そして、それらをまったく使用しないことをお勧めします。あなたの製品には独自のバージョンがあります。製品の特定のバージョンは、skrillex ライブラリの特定のバージョンに依存します。したがって、それを確定して、そのバージョンで生きてください。

または、Aukjan によって提案されたソリューションを使用して、Maven を 2 回呼び出します。私の知る限り、maven に pom を強制的にリロードさせる方法はないため、1 回の maven 呼び出しでこれを行うことはできません。注意: skrillex ライブラリの API を変更すると、ビルドが壊れる可能性があります。

于 2013-05-29T12:53:18.647 に答える
0

settings.xml または mvn -U に「常に」updatePolicy を入れるだけです。これで問題が解決します:

      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy>
      </snapshots>
      <releases>
        <updatePolicy>always</updatePolicy>
      </releases>
于 2015-03-25T17:31:54.240 に答える