web-dev-qa-db-ja.com

Gradleは依存関係内の特定のファイルを除外します

依存関係(推移的な依存関係ではない)内にある特定のファイルをダウンロードから除外する方法があるのか​​と思っていました。

ビルドをAnt + IvyからGradleに切り替えていますが、これは以前Ivyで行っていました。求めているのは、Artifactoryにコンパイル済みの多くのwsdl jarを含む単一の依存関係があるためです。

Ivyでは、次のような設定でした。

これら6つのアーティファクトは、1つのディレクトリrepo/dep.location/example/7.3/jarのArtifactoryに公開されます。

<publications>
    <artifact name="foo-1-0" type="jar" />
    <artifact name="foo-1-0-async" type="jar" />
    <artifact name="foo-1-0-xml" type="jar" />
    <artifact name="bar-1-0" type="jar" />
    <artifact name="bar-1-0-async" type="jar" />
    <artifact name="bar-1-0-xml" type="jar" />
</publications>

これは、6つのアーティファクトのうち2つだけを取得する方法です。

<dependency org="dep.location" name="example" rev="7.3"
            conf="compile,runtime">
    <include name="foo-1-0-async"/>
    <include name="foo-1-0-xml"/>
</dependency>

現在、Gradleで同様のことを行おうとすると、除外は無視され、6つのアーティファクトがすべてダウンロードされます。

compile (group:"dep.location", name:"example", version:"7.3")
{
    exclude module:'foo-1-0-xml'
    exclude module:'bar-1-0'
    exclude module:'bar-1-0-async'
    exclude module:'bar-1-0-xml'
}

Gradleバージョン1.8を使用しています。

43
bhumphrey

Gradleにはこれを達成するためのサポートが組み込まれているとは思いませんが、クラスパスからアーティファクトを削除することはできます。

このスレッド に触発され、Gradleフォーラムでこれを思いつきました:

// The artifacts we don't want, dependency as key and artifacts as values
def unwantedArtifacts = [
    "dep.location:example": [ "foo-1-0-xml", "bar-1-0", "bar-1-0-async", "bar-1-0-xml"],
]

// Collect the files that should be excluded from the classpath
def excludedFiles = configurations.compile.resolvedConfiguration.resolvedArtifacts.findAll {
    def moduleId = it.moduleVersion.id
    def moduleString = "${moduleId.group}:${moduleId.name}:${moduleId.version}" // Construct the dependecy string
    // Get the artifacts (if any) we should remove from this dependency and check if this artifact is in there
    it.name in (unwantedArtifacts.find { key, value -> moduleString.startsWith key }?.value)
}*.file

// Remove the files from the classpath
sourceSets {
    main {
        compileClasspath -= files(excludedFiles)
    }
    test {
        compileClasspath -= files(excludedFiles)
    }
}

Gradleはおそらくファイルをダウンロードしてキャッシュしますが、クラスパスに含めるべきではないことに注意してください。

4
Raniz

これがあなたが望むものかどうかはわかりませんが、Spring BootとWildflyを使用しているので、Tomcat-starterモジュールをSpring Boot標準パッケージから削除する必要があります。ただし、コードの状態は次のとおりです。

configurations {
    compile.exclude module: "spring-boot-starter-Tomcat"
}

対応するjarがダウンロードされていないか、単にクラスパスにないかどうかは確認していませんが、使用されていないことがわかります。

1