2012-02-08 12 views
3

これがGradle 1.0m7のバグか、これを間違っているかどうかはわかりません。Gradleを使用してコンパイルされたクラスから追加のjar成果物を作成するにはどうすればよいですか?

私たちは、プロジェクトの一部としてコンパイルされたクラスをいくつか持っています。個々のクラスには、個別にアーティファクトを入れたいものがあります。これらは、たとえばスタンドアロンのドメインモデルオブジェクトで、別のプロジェクトと共有したいものです。

私はマルチプロジェクトのビルドルートに行きたくないので、Gradleにこれらのための別のjarを作成するように指示するにはどうすればよいですか?

は現在、我々はこれをやっている:

task modelJar(type: Jar) { 
    classifier = 'model' 
    from fileTree(dir: sourceSets.main.classesDir).matching { include 'com/foo/bar/model/**' } 
} 

artifacts { 
    archives modeljar 
} 

問題をここでは、modeljarタスクは前のクラスがコンパイルされて実行されています。最初は私たちはこれを認識せず、これが機能していると思った。現実のものではなく、以前のランからクラスを拾っていたことが分かります。ビルドの前にきれいにすると、クラスがないjarが生成され、問題が明らかになります。

私はカスタム設定を見ていましたが、かなり複雑に思えましたが、ビルドファイルがあまり複雑にならないようにしました。

アドバイスをお待ちしています。

ありがとうございました。

答えて

5

modelJarタスクはclasses(組み込み)タスクに依存しますか?これは、modelJarタスクの前にコンパイルが完了していることを確認する必要があります。

task modelJar(dependsOn: classes, type: Jar){ 
    ... 
+0

Briliant!それはそれをした! Gradleは素晴らしかったですが、私はそれが起こっている魔法を理解することはそれほど難しくありませんでした。私はこのクラスのタスクが何をしているのか分からず、アーティファクトクロージャに追加されたタスクに依存関係を追加することもできませんでした。ありがとう! – codemaven

+0

うれしいことです。ウェブサイトでGradleのマニュアルをチェックしてください。それはかなり素晴らしいです! – rodion

11

これを行うための最も便利な方法は、

task modelJar(type: Jar) { 
    classifier = 'model' 
    from sourceSets.main.output 
    include 'com/foo/bar/model/**' 
} 

いくつかの背景です: sourceSets.main.outputはビルド可能なfilecollectionです。つまり、タスクがこのファイルコレクションで動作する場合、gradleは、このファイルコレクションを作成してから別のタスクで使用できるようになっていることを認識します。この特定のケースでは、sourcesets.main.classesはjavaプラグインのclassesタスクに接続されています。したがって、modelJarタスクは明示的にクラスタスクに依存する必要はありません。

+0

良い答えですが、私はrodionのソリューションがより良いセマンティクスを持っていると思います。これは明らかに何かに依存していると言われていますが、これとは関係しています。しかし、ありがとう! – codemaven

+6

さて、私はそれについて少し違う意見があります。グラデルの初心者の視点から、あなたは正しいかもしれません。しかし、これを考えてみましょう:あなたのjarを作成するときに興味を持っているのは、あなたの主要なソースセットの出力です。しかし、modelJarの作者として、私はこの仕事をどのような仕事が担当しているのかは気にしません。 –

関連する問題