182

マルチプロジェクト構成があり、gradle を使用したいと考えています。

私のプロジェクトは次のようなものです:

  • プロジェクトA

    • ->src/main/java
    • ->src/test/java
  • プロジェクトB

    • -> (プロジェクト Asrc/main/java依存) src/main/java
    • -> (プロジェクト Asrc/test/java依存) src/test/java

私のプロジェクト B build.gradleファイルは次のようなものです。

apply plugin: 'java'
dependencies {
  compile project(':ProjectA')
}

タスクはcompileJavaうまく機能しますが、プロジェクト AcompileTestJavaからテスト ファイルをコンパイルしません。

4

17 に答える 17

141

非推奨 - Gradle 5.6 以降では、この回答を使用してください。

Project Bでは、testCompile依存関係を追加するだけです。

dependencies {
  ...
  testCompile project(':A').sourceSets.test.output
}

Gradle 1.7 でテスト済み。

于 2011-11-01T16:07:13.587 に答える
67

簡単な方法は、ProjectB に明示的なタスクの依存関係を追加することです。

compileTestJava.dependsOn tasks.getByPath(':ProjectA:testClasses')

難しい (しかしより明確な) 方法は、ProjectA の追加のアーティファクト構成を作成することです。

task myTestsJar(type: Jar) { 
  // pack whatever you need...
}

configurations {
  testArtifacts
}

artifacts {
   testArtifacts myTestsJar
}

testCompileProjectBの依存関係を追加します

apply plugin: 'java'
dependencies {
  compile project(':ProjectA')
  testCompile project(path: ':ProjectA', configuration: 'testArtifacts')
}
于 2011-04-13T11:40:49.103 に答える
22

私はそれが古い質問であることを知っていますが、私はちょうど同じ問題を抱えていて、何が起こっているのかを理解するのに時間を費やしました. Gradle 1.9 を使用しています。すべての変更は ProjectB にある必要がありますbuild.gradle

ProjectB のテストで ProjectA のテスト クラスを使用するには:

testCompile files(project(':ProjectA').sourceSets.test.output.classesDir)

sourceSetsプロパティが ProjectA で使用可能であることを確認するには:

evaluationDependsOn(':ProjectA')

ProjectB をコンパイルするときに、ProjectA のテスト クラスが実際にそこにあることを確認するには、次のようにします。

compileTestJava.dependsOn tasks.getByPath(':ProjectA:testClasses')
于 2014-02-05T14:47:32.603 に答える
22

私は最近この問題に出くわしましたが、これは答えを見つけるのが難しい問題です。

あなたが犯している間違いは、プロジェクトが主要な成果物と依存関係をエクスポートするのと同じ方法でテスト要素をエクスポートする必要があると考えていることです。

個人的にもっと成功したのは、Gradle で新しいプロジェクトを作成したことです。あなたの例では、私はそれに名前を付けます

プロジェクト A_Test -> src/main/java

プロジェクト A/src/test/java に現在あるファイルを src/main/java に配置します。Project A のすべての testCompile 依存関係を、Project A_Test の依存関係をコンパイルします。

次に、プロジェクト A_Test をプロジェクト B の testCompile 依存関係にします。

両方のプロジェクトの作成者の観点から考えると論理的ではありませんが、junit や scalatest (およびその他) などのプロジェクトについて考えると、非常に理にかなっていると思います。これらのフレームワークはテスト関連ですが、独自のフレームワーク内の「テスト」ターゲットの一部とは見なされません - それらは、他のプロジェクトがたまたまテスト構成内で使用する主要なアーティファクトを生成します. 同じパターンに従いたいだけです.

ここにリストされている他の回答を実行しようとしても、個人的にはうまくいきませんでした (Gradle 1.9 を使用) が、ここで説明するパターンはとにかくクリーンなソリューションであることがわかりました。

于 2014-01-31T16:13:00.727 に答える
11

gradle プラグインとして利用可能な新しい testJar ベースの (trnsitive 依存関係がサポートされている) ソリューション:

https://github.com/hauner/gradle-plugins/tree/master/jartest

https://plugins.gradle.org/plugin/com.github.hauner.jarTest/1.0

ドキュメントから

マルチプロジェクトの gradle ビルドを使用している場合、サブプロジェクト間にテストの依存関係がある可能性があります (これはおそらく、プロジェクトが適切に構造化されていないことを示しています)。

たとえば、サブプロジェクトのプロジェクト B がプロジェクト A に依存し、B が A へのコンパイルの依存関係だけでなく、テストの依存関係も持っているプロジェクトを想定します。B のテストをコンパイルして実行するには、A からいくつかのテスト ヘルパー クラスが必要です。

デフォルトでは、gradle はプロジェクトのテスト ビルド出力から jar アーティファクトを作成しません。

このプラグインは、testArchives 構成 (testCompile に基づく) と jarTest タスクを追加して、テスト ソース セットから jar を作成します (分類子 test が jar の名前に追加されます)。次に、A の testArchives 構成に B を依存させることができます (これには、A の推移的な依存関係も含まれます)。

A では、プラグインを build.gradle に追加します。

apply plugin: 'com.github.hauner.jarTest'

B では、次のように testArchives 構成を参照します。

dependencies {
    ...
    testCompile project (path: ':ProjectA', configuration: 'testArchives') 
}
于 2015-12-30T11:58:08.577 に答える
9

私はパーティーに遅れています(現在はGradle v4.4です)が、これを見つけた他の人のために:

仮定:

~/allProjects
|
|-/ProjectA/module-a/src/test/java
|
|-/ProjectB/module-b/src/test/java

build.gradleプロジェクト B (A からのいくつかのテスト クラスが必要なプロジェクト) に移動し、次を追加します。

sourceSets {
    String sharedTestDir = "${projectDir}"+'/module-b/src/test/java'
    test {
        java.srcDir sharedTestDir
    }
}

または(プロジェクトの名前が であると仮定ProjectB

sourceSets {
    String sharedTestDir = project(':ProjectB').file("module-b/src/test/java")
    test {
        java.srcDir sharedTestDir
    }
}

出来上がり!

于 2018-06-22T12:11:24.690 に答える
6

ここでKotlin DSLを使用している場合は、 Gradleのドキュメントに従ってそのようなタスクを作成する必要があります。

以前の回答と同様に、テストクラスとメインクラスを混在させないように、プロジェクト内にテストクラスを共有する特別な構成を作成する必要があります。

簡単な手順

  1. プロジェクト Aでは、以下を追加する必要がありますbuild.gradle.kts
configurations {
    create("test")
}

tasks.register<Jar>("testArchive") {
    archiveBaseName.set("ProjectA-test")
    from(project.the<SourceSetContainer>()["test"].output)
}

artifacts {
    add("test", tasks["testArchive"])
}
  1. 次に、依存関係のプロジェクト Bで、以下を追加する必要がありますbuild.gradle.kts
dependencies {
    implementation(project(":ProjectA"))
    testImplementation(project(":ProjectA", "test"))
}
于 2020-05-08T15:16:08.900 に答える
5

アーティファクトの依存関係を使用する場合:

  • プロジェクト B のソース クラスはプロジェクト A のソース クラスに依存する
  • プロジェクト B のテスト クラスは、プロジェクト A のテスト クラスに依存します。

次に、 build.gradleの ProjectB の依存関係セクションは次のようになります。

dependencies {

  compile("com.example:projecta:1.0.0")

  testCompile("com.example:projecta:1.0.0:tests")

}

これが機能するためには、ProjectA は-tests jarを構築し、それが生成するアーティファクトに含める必要があります。

ProjectA のbuild.gradleには、次のような構成が含まれている必要があります。

task testsJar(type: Jar, dependsOn: testClasses) {
    classifier = 'tests'
    from sourceSets.test.output
}

configurations {
    tests
}

artifacts {
    tests testsJar
    archives testsJar
}

jar.finalizedBy(testsJar)

ProjectA の成果物が成果物に公開されると、-tests jar が含まれます。

ProjectBの依存関係セクションにある testCompile は、-tests jar にクラスを取り込みます


開発目的で、Flat ProjectA のソース クラスとテスト クラスを ProjectB に含めたい場合、ProjectB の build.gradle の依存関係セクションは次のようなります。

dependencies {

  compile project(':projecta')

  testCompile project(path: ':projecta', configuration: 'tests')

}
于 2019-02-11T23:54:59.260 に答える
4

Nikitaが言及したAndroid + Kotlinのソリューションは次のようになります。

task jarTests(type: Jar, dependsOn: "assembleDebugUnitTest") {
    getArchiveClassifier().set('tests')
    from "$buildDir/tmp/kotlin-classes/debugUnitTest"
}

configurations {
    unitTestArtifact
}

artifacts {
    unitTestArtifact jarTests
}

依存関係を使用するプロジェクトの Gradle:

testImplementation project(path: ':shared', configuration: 'unitTestArtifact')
于 2020-08-07T08:45:58.113 に答える
2

他の回答のいくつかは何らかの形でエラーを引き起こしました.Gradleは他のプロジェクトからテストクラスを検出しなかったか、インポート時にEclipseプロジェクトが無効な依存関係を持っていました. 誰かが同じ問題を抱えている場合は、次の方法をお勧めします。

testCompile project(':core')
testCompile files(project(':core').sourceSets.test.output.classesDir)

最初の行は、Eclipse が他のプロジェクトを依存関係としてリンクするように強制するため、すべてのソースが含まれており、最新の状態になっています。2 つ目は、Gradle が実際にソースを確認できるようにしながら、無効な依存関係エラーを発生させないようにtestCompile project(':core').sourceSets.test.outputします。

于 2016-05-24T20:14:36.257 に答える
-1

プロジェクト B:

dependencies {
  testCompile project(':projectA').sourceSets.test.output
}

1.7-rc-2 で動作するようです

于 2013-08-06T21:43:35.927 に答える