2017-09-07 6 views
0

私は、build.gradleファイルで次のように定義された2つのgradleプロジェクトで構成されるプロジェクトを持っています。別のgradleモジュールからクラスをインポート

project(':clients') { 
    archivesBaseName = "clients" 

    dependencies { 
    compile libs.lz4 
    compile libs.snappy 
    compile libs.slf4jApi 

    testRuntime libs.slf4jlog4j 
    } 

    jar { 
    dependsOn createVersionFile 
    from("$buildDir") { 
     include "proj/$buildVersionFileName" 
    } 
    } 

} 

project(':core') { 
    apply plugin: 'scala' 
    apply plugin: "org.scoverage" 
    archivesBaseName = "proj_${versions.baseScala}" 

    dependencies { 
    compile project(':clients') 
    compile libs.joptSimple 
    compile libs.metrics 
    compile libs.scala 
    compile libs.slf4jlog4j 
    compile libs.zkclient 
    compile libs.zookeeper 
    compile libs.scalaParserCombinators 

    } 

    tasks.create(name: "copyDependantLibs", type: Copy) { 
    from (configurations.testRuntime) { 
     include('slf4j-log4j12*') 
    } 
    from (configurations.runtime) { 
     exclude('kafka-clients*') 
    } 
    into "$buildDir/dependant-libs-${versions.scala}" 
    duplicatesStrategy 'exclude' 
    } 

    jar { 
    dependsOn('copyDependantLibs') 
    } 

    tasks.create(name: "copyDependantTestLibs", type: Copy) { 
    from (configurations.testRuntime) { 
     include('*.jar') 
    } 
    into "$buildDir/dependant-testlibs" 
    duplicatesStrategy 'exclude' 
    } 

    systemTestLibs.dependsOn('jar', 'testJar', 'copyDependantTestLibs') 

} 

問題は、私は「クライアントのモジュール内から「コア」モジュール内で定義された任意のクラスをインポートすることができないということです。しかし、それ以外の方法でうまく動作します。 これはおそらく、 'core'モジュールの依存関係としてcompile project(':clients')と記述されているためです。私がcompile project(':core')を 'clients'モジュールの依存関係とすると、IntelliJはクラスを 'コア'モジュールから 'clients'にインポートすることができます。しかし、gradleは正当には、これら2つのモジュールの間に循環的な依存関係が存在すると主張する。

「コア」内のクラスを、クライアント間でコンパイル依存関係にすることなくアクセスできるようにする方法をまとめます。

+0

'settings.gradle'ファイルが定義されていますか?基本的にはうまくいくはずです。 – Opal

+0

'' clients'を 'core'のサブプロジェクトにします。 – LazerBanana

+0

@Opal私は 'settings.gradle'ファイルを持っていますが、' include 'core'、 'clients''と書かれています –

答えて

1

我々は

は、なぜあなたはこれが必要なのですか'core'モジュールの依存関係としてcompile project(':clients')に言及?そうした場合、あなたは、あなたが最初にclientsをコンパイルする必要があり、それらをコンパイルするが、あなたはなど、coreからクラスを必要とするclientsコンパイルするので、clientscoreからクラスを使用することはできません

あなたが唯一のいくつかの特定のクラスが必要な場合clientsからcoreに移動すると、clientcoreの両方が依存する3つ目のモジュールに移動することができます。または、に必要なクラスcoreから同じことをしてください。

あなたが特定のクラス間の循環依存(coreから例えばクラスAが再びAをインポートする必要がある、clientsからBをインポートする必要があり、ループは、2つの以上のクラスを含んでいてもよい)がある場合、それらは単一である必要がありますモジュール。

+0

プロジェクトの構造を変更せずにこの問題に対処する方法はないと言っていますか? –

+0

いいえ、あなたが必要とするものを誤解しない限り、そうではありません。あなたの厳しい要求に応じて助けるかもしれないもう一つのことは、 'clients'の' core'クラスを直接参照するのではなく、 'clients'にインタフェースを定義し、' core'クラスがこれらのインタフェースを実装するようにすることです。 –

関連する問題