Gradle с нестандартными именованными исходными наборами - как мне сделать их доступными для тестовых классов?

У меня есть (устаревший) Java-проект, который я переконфигурирую, чтобы построить с Gradle. Сборка должна, в конце концов, вывести ряд jar архивы, поэтому я разделил, чтобы разделить источник на наборы источников, которые соответствуют подразделению вывода на архивы.

Дерево файлов выглядит примерно так:

- project root
    - src
        - setOne
             - java
                  - ...
             - resources
                  - ...
        - setTwo
             - java
                  - ...
        - setThree
             - java
                  - ...
             - resources
                  - ...
        - test
             - java
                  - ...

    - build.gradle

И в build.gradle У меня есть следующее:

apply plugin: 'java'

sourceSets {
    setOne
    setTwo {
        compileClasspath += setOne.output
    }
    setThree

    test
}

dependencies {
    setOne group: 'foo', name: 'bar', version: '1.0'
}

// Setup dependencies so that compileJava compiles all source sets
// while avoiding cyclic dependencies for main and test
sourceSets.matching { ss -> 
    !(ss.getName().contains('test') || ss.getName().contains('main')) 
}.each { ss ->
    compileJava.dependsOn ss.getCompileJavaTaskName()
}

Когда я пытаюсь построить это, я получаю кучу предупреждений от compileSetTwoJava цель о некоторых классах не решаются - ссылаясь на классы из foobar библиотека импортирована в setOne, Я предполагаю, что это потому, что Gradle только дает setTwo доступ к встроенным классам setOne - но почему он не может разрешить зависимости для классов, импортируемых из setOne в процессе?

Как мне правильно это настроить?

1 ответ

Решение

Оказывается, это было так же просто, как я и думал - если вы просто начнете правильный путь. Definining

setTwo {
    classPath += setOne.runtimeClasspath // instead of setOne.output
}

решает проблему.

ОБНОВИТЬ:

Кажется, даже лучше сделать это среди зависимостей, где можно сделать

dependencies {
    setTwo sourceSets.setOne.output
}

и заставить его работать.

Другие вопросы по тегам