0

sourcesGrade にマルチプロジェクト (複数の Java サブプロジェクト) があり、javadocアーティファクトを含む Maven リポジトリ (現在はローカルリポジトリ) にアップロードする予定です。各サブプロジェクトに次のコードを追加するだけでmaven install、作業を実行できます。

apply plugin: 'maven'

task sourcesJar(type: Jar, dependsOn:classes) {
        from sourceSets.main.allSource 
        classifier = 'sources' 
} 
task javadocJar(type: Jar, dependsOn:javadoc) {
        from javadoc.destinationDir 
        classifier = 'javadoc' 
}
artifacts { 
        archives jar
        archives sourcesJar 
        archives javadocJar 
}

10 個のサブプロジェクトで同じコードを使用するのはあまり良くないので、このコードをプロジェクトのsubprojects { ... }構成に移動することにしました。ただし、現在は機能しません。空のソースと javadoc jar のみがビルドされ、通常の jar は無視され、ローカルの Maven リポジトリにファイルがコピーされなくなりました。これを正しく行う方法は?maven install

ありがとう。

4

1 に答える 1

1

親プロジェクトのビルド スクリプトは、そのサブプロジェクトのビルド スクリプトの前に評価されます。一部のコードを親プロジェクトのビルド スクリプトにリフトする場合、評価順序が損なわれないようにする必要があります。つまり、リフトされたコードが、サブプロジェクトのビルド スクリプトによってのみ設定されるプロパティを積極的に読み取らないようにする必要があります。たとえばjavadoc.destinationDir、サブプロジェクトのビルド スクリプトによって が設定されている場合、そのコードも持ち上げるかfrom javadoc.destinationDir、親ビルド スクリプトの式の評価を延期する必要があります。

評価を延期する方法はいくつかあります。一部のプロパティ (アーカイブ タスクのfromや などinto) はクロージャを受け入れます。したがって、簡単に行うことができますfrom { javadoc.destinationDir }。別のオプションはgradle.projectsEvaluated {}、 、project.afterEvaluate {}、または などのフックを使用することtask.doFirst {}です。どの手法を使用するかを決定するための最初のステップは、Gradle Build Language Referenceで問題のプロパティを調べることです。

あなたのビルド スクリプトをこれ以上見ることなく、あなたの特定の問題はapply plugin: "java"、親ビルド スクリプトのsubprojects {}ブロックに持ち上げないことに関連していると推測されます。

構成インジェクション (例: 経由subprojects {}) の代わりに、共通コードを別のビルド スクリプトに入れ、プロジェクト ビルド スクリプトにそのコードをapply from:. 場合によっては、構成インジェクションよりもコードを (選択的に) 共有する方が簡単な方法です。多くの場合、2 つのアプローチは一緒に使用されます。

于 2013-02-10T09:33:26.113 に答える