2017-01-29 19 views
2

ビルドプロセスにコード生成が含まれているプロジェクトを作成したいとします。生成されたコードは、メインコード(共通の基底クラスを継承しています)とJCenterのモジュール上にコンパイル時の依存関係があります。メインコードは、生成されたコードに効果的にランタイム依存性を持ちます。おそらく、アプリケーションが主コードと生成コードの両方にランタイム依存性を持ち、さらに両方のモジュール依存性を持っていると言う方が正しいでしょう。Gradleで生成されたソースセットにランタイム依存関係を追加する

EDIT:依存関係をより明確にするために、矢印は設定から​​それが依存するものを指している、ちょっとした図です。ご覧のように、依存関係グラフにはサイクルはありません。

main compile ← generated compile → generated module 
     ↑    ↑ 
main runtime → generated runtime 

私は本当に生成コードをメインコードに設定された別のソースに入れたいと思います。また、アプリケーションプラグインを使用して、gradle rungradle installDistを提供したいと考えています。

最新のGradle 3.3を使用しています。

私はproject to try thisを作成しました。

sourceSets { 
    generated { 
     java { 
      srcDirs = ["$buildDir/src/generated/java"] 
      compileClasspath += sourceSets.main.output 
     } 
    } 
    main { 
     java { 
      runtimeClasspath += sourceSets.generated.output + sourceSets.generated.runtimeClasspath 
     } 
    } 
} 

とコード生成するタスクがある:それには、ソースセットがある

task generateSource { 
    doLast { 
     // generate the code into sourceSets.generated.java.srcDirs[0] here 
    } 
} 

compileGeneratedJava.dependsOn generateSource 

生成と生成されたコードの作業罰金のコンパイルが。 gradle generatedClassesと言うと、メインコードをコンパイルし、ソースを生成し、生成されたコードをコンパイルします。

ただし、実行中でも配信も正しく動作しません。私がgradle runと言うと、生成されたコードの生成やコンパイルを試みません。私がgradle generatedClasses runと言うと、生成されたコードが生成され、コンパイルされますが、実行されたJavaプロセスのクラスパスには追加されません。もし私がgradle installDistと言うと、生成されたコードを生成したりコンパイルしたりしません。同様に、gradle generatedClasses installDistと言うと、生成されたコードが生成され、コンパイルされますが、配布には含まれません。

生成されたソースセットのモジュール依存関係も、クラスパスまたはディストリビューションには含まれません。

task runProperly(type: JavaExec) { 
    classpath = sourceSets.main.runtimeClasspath 
    main = mainClassName 
} 

完璧に動作すること:

本当に奇妙なことは、私は、実行タスクの独自のバージョンで定義した場合ということです!

なぜ、コンパイルされたクラスも、生成されたソースセットのモジュール依存関係も、実行クラスまたは配布クラスパスに含まれていませんか?

答えて

1

applicationプラグインがソースセットを変更する前にクラスパスを設定しているためです。 sourcesets {}の後にapply plugin: 'application'を移動すると、ビルドは期待通りに機能します。

私の意見では、sourcesetは生成コードの正しい場所ではありません。あなたのビルドは次のようになります:

apply plugin: 'application' 

repositories { 
    jcenter() 
} 

dependencies { 
    compile group: 'org.fusesource.jansi', name: 'jansi', version: '1.14' 
    compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.22' 
    runtime group: 'ch.qos.logback', name: 'logback-classic', version: '1.1.9' 
} 

mainClassName = 'Application' 

task generateSources { 
    outputs.dir temporaryDir 

    doLast { 
    // Generate some code into temporaryDir 
    } 
} 

compileJava { 
    source generateSources 
} 
+0

ソースセット定義の後にプラグインアプリケーションを移動すると、実際に 'gradle run'が正しく動作します。ありがとう!しかし、 'gradle installDist'は動作しません。生成されたコードも依存関係も配布に含まれません。 –

+0

生成されたソースを独立したソースセットに保存することは非常に賢明です。なぜなら、独自の依存関係を持つことができるからです。生成されたコードでは、通常のコードでは使用しない特別なライブラリがいくつか使用されています。そのため、私はそれらを衛生の問題として別々にしておきたいと思います。それは重要ではありませんが、それは役に立つでしょう。 –

+0

コード内に相互参照があります。ですから、 'main'で一つのクラスをコンパイルし、' generated'で一つのクラスをコンパイルし、 'main'をもう一度コンパイルすることはできません。生成されたコードは、とにかく 'main'のクラスパスを使用します。 –

関連する問題