私はジップアーティファクトを作成Gradleのプロジェクトを持っています。私は経由でアーティファクトを定義しますartifacts.add('default', zipTask)
。私は経由して別のプロジェクトにこのプロジェクトを追加includeBuild
(および依存関係としてジッパーを使用しますdependencies { myConfiguration 'org.example:testA:+@zip' }
)。ここまでは順調ですね。できます。
私はプラグインを追加するときに問題が始まりjava
最初のプロジェクトに。何らかの理由で、ジップアーティファクトを見つけることからGradleのを防ぐことができます。エラーは次のとおりです。
Execution failed for task ':doubleZipTask'.
> Could not resolve all files for configuration ':myConfiguration'.
> Could not find testA.zip (project :testA).
どうして?どのようにそれを修正するには?
完全な例:
事業 testA
settings.gradle
:
rootProject.name = 'testA'
build.gradle
:
plugins {
id 'base'
// Uncomment the line below to break the zip artifact
//id 'java'
}
group = 'org.test'
version = '0.0.0.1_test'
task zipTask(type: Zip) {
from './settings.gradle' // just so the zip isn't empty
}
artifacts.add('default', zipTask)
事業 testB
settings.gradle
:
rootProject.name = 'testB'
// This line may be commented out in some cases and then the artifact should be downloaded from Maven repository.
// For this question it should be always uncommented, though.
includeBuild('../testA')
build.gradle
:
plugins {
id 'base'
}
configurations {
myConfiguration
}
dependencies {
myConfiguration 'org.test:testA:0.0.0.+@zip'
}
task doubleZipTask(type: Zip) {
from configurations.myConfiguration
}
アップデート1
私はの終わりにいくつかの診断コードを追加しましたbuild.grade
:
configurations.default.allArtifacts.each() {
println it.toString() + ' -> name: ' + it.getName() + ', extension: ' + it.getExtension()
}
ととバージョンでjava
プラグインには、印刷します。
ArchivePublishArtifact_Decorated testA:zip:zip: -> name: testA, extension: zip
org.gradle.api.internal.artifacts.dsl.LazyPublishArtifact@2c6aaa5 -> name: testA, extension: jar
しかし、私は追加のアーティファクトが何かを破ることができるかはわかりません。
私が二アーティファクト自分自身を追加するときに問題になるとは思われません。
アップデート2
たぶん、zipファイルには、私の意図を最高の表現ではありません。すべての後、私は1つのプロジェクトでJava関連ファイルを構築することができ、別でそれらを圧縮します。しかし、問題は、warファイルに適用されます。(それは個別に実行することができないので、戦争のプラグインは内部的にJavaプラグインを使用しています。)
以下の設定は、Gradleの5.6(別の属性を使用している場合、それはおそらく、以前のバージョンで動作します)で動作するはずです。それはほとんどで示される変化を除いて、元の設定に対応しますXXX
。
事業 testA
settings.gradle
:
rootProject.name = 'testA'
build.gradle
:
plugins {
id 'base'
// Uncomment the line below to break the zip artifact
//id 'java'
}
group = 'org.test'
version = '0.0.0.1_test'
task zipTask(type: Zip) {
from './settings.gradle' // just so the zip isn't empty
}
// XXX added an attribute to the configuration
configurations.default.attributes {
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE,
project.objects.named(LibraryElements, 'my-zipped-lib'))
}
artifacts.add('default', zipTask)
事業 testB
settings.gradle
:
rootProject.name = 'testB'
// This line may be commented out in some cases and then the artifact should be downloaded from Maven repository.
// For this question it should be always uncommented, though.
includeBuild('../testA')
build.gradle
:
plugins {
id 'base'
}
configurations {
// XXX added the same attribute as in the testA project
myConfiguration {
attributes {
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE,
project.objects.named(LibraryElements, 'my-zipped-lib'))
}
}
}
dependencies {
myConfiguration 'org.test:testA:0.0.0.+@zip'
}
task doubleZipTask(type: Zip) {
from configurations.myConfiguration
}
私はとない場合の両方で、このセットアップをテストしているjava
プラグイン。私はまた、Mavenのリポジトリに公開とさせるテストしたtestB
、そこから代わりのを含めビルドからその依存関係を取りますtestA
。追加の依存関係を追加するtestB
のJARアーティファクトにtestA
(myConfiguration 'org.test:testA:0.0.0.+@jar'
あまりにも、働いていました)。
(私は信じている)上で何が起こっているかのいくつかの説明:Gradleのは、ローカルコンポーネント/アーティファクトれ、自動的に決定する方法必要testA
それは、外部依存関係を置き換えるために使用することができますがtestB
。
- 適用せずに
java
プラグインを、そこに単一の成分だけ/アーティファクトであり、私の推測では、Gradleのはそれからちょうど前置きその単一のものを選択するということです。 - あなたが見たように、適用することにより、
java
プラグインを、別のアーチファクトがに追加されますtestA
。今、どちらがテイクをGradleのでしょうか?一つは、それがで依存関係で指定されたファイルの拡張子を見てだろうと期待するtestB
が、その場合ではないようです。Gradleのが実際に動作していないように見える成果物の依存関係を代入するときのレベルではなくで、モジュール / コンポーネントレベル。あなたは一つの成分を選択すると簡単ですので、我々は唯一、2つのアーティファクトを持つ一つの成分を持っていると言うかもしれません。しかし、私たちは、実際には2つの持っているものと思わ変種同じコンポーネントのをとのGradleは、これらのいずれかを選択したいと考えてい変種。あなた自身でtestB
セットアップは、それを選択するためにどのバリアントのGradleを言うだろう与えられた手掛かりはありません。それは、(確かに悪い/誤解を招くエラーメッセージが表示されて)失敗します。私の変更ではtestB
、セットアップ、私は手掛かりを提供します。私たちは、特定の持っているバリアントたいとのGradleを伝える属性値を持つがmy-zipped-lib
。私が出版された構成で同じ属性を追加しましたのでtestA
、Gradleのは今(だけ必要な属性を持つものもあるので)右のバリアントを選択することができます。依存関係のファイルの拡張子は、第二段階ではまだ関連している:Gradleのコンポーネントバリアントを選択した後、それはまだ右のアーティファクトを選択する必要がある-だけにしますが。
私たちは実際のリムに取り組んでいることを注意サポートされているものを複合今日のビルドで。参照してくださいGradleの問題#2529「非ジャー成果物を公開するプロジェクトは」ひどくうまくサポートされていなかったと述べています。私が最初にあなたの質問を見たとき、私は正直に私たちがここに運が悪いだろうと思った...しかし、それは再び近いリム;-)に少しステップへの道がありますようです
印加しながら、複数のカスタムアーティファクトの作品を追加する理由をコメントでは、質問が上がったjava
、プラグインブレイクビルドを。私は上記の説明しようとしたとして、それは複数の問題ではありませんアーティファクトが、複数の構成要素のバリアント。IIUICは、これらの変異体は、構成上の異なる属性に由来します。あなたは、このような属性を追加しない場合、あなたは別のコンポーネントのバリエーションを持っていません。しかし、Javaプラグインはありません結果的に異なるコンポーネントへのリードは、プロジェクト(/コンポーネント)でバリアントような属性を追加します。あなたが興味を持っている場合、あなたはあなたに次のようなものを追加することによって、異なる属性を見ることができますbuild.gradle
。
configurations.each { conf ->
println "Attributes of $conf:"
conf.attributes.keySet().each { attr ->
println "\t$attr -> ${conf.attributes.getAttribute(attr)}"
}
}
今どこで、いつどの属性を追加するには?それはあなたの設定に依存します。私は盲目的にそれが魔法のように物事を解決するだろうことを期待してすべての構成に属性を追加しないでしょう。それは(あなたのセットアップに応じて)動作するかもしれませんが、それは確かにきれいではないと思います。あなたの質問が示すように、プロジェクトの設定が複雑なおよび/または特別なようであれば、それはおそらくあなたが必要がある構成についてより深く考えるように意味をなすだろうし、何が彼らが運ぶ必要があります属性。最初のセクションのGradleドキュメントページ私は上記のリンクしていることは、おそらくあなたは複雑のGradleで構成、これらのニュアンスに精通していない場合は出発点は良いです、まだ。そして、はい、私は、このようなロジックはGradleのプラグインで最高のライブだろうに同意するものとします。