Gradle: зависимость includeFlat и sourceSets для сборок для каждой платформы

Я новичок в мире Java и Gradle. Я сделал библиотеку JSerial, которая будет поддерживать несколько платформ (Android, Linux и Windows).

Чтобы иметь возможность выбрать платформу, на которую я нацелен, я определил несколько sourceSets в моем файле JSerial gradle:

sourceSets {
    windows {
        compileClasspath += sourceSets.main.output
        runtimeClasspath += sourceSets.main.output
    }
    linux {
        compileClasspath += sourceSets.main.output
        runtimeClasspath += sourceSets.main.output
    }
}

dependencies {
    linuxCompile 'net.java.dev.jna:jna:4.1.0'
    linuxCompile 'net.java.dev.jna:jna-platform:4.1.0'
    windowsCompile 'net.java.dev.jna:jna:4.1.0'
    windowsCompile 'net.java.dev.jna:jna-platform:4.1.0'
}

main sourceSet по умолчанию создает общий интерфейс и т. Д. Затем windows sourceSet создает реализацию Windows (то же самое для Linux и Android).

Я создаю проект, который использует эту библиотеку и зависит от нее с помощью gradle includeFlat. Вот часть зависимости моего файла gradle:

dependencies {
    compile project(':JSerial')
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

Это работает. Но я хотел бы полагаться на исходный набор "windows", потому что этот проект является приложением Windows. Я пробовал следующее:

dependencies {
    compile project(':JSerial').sourceSets.windows.output
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

Но не работает, у меня следующая ошибка:

Не удалось найти свойство "окна" в контейнере SourceSet.

Что случилось ?

PS: Если есть лучший способ сделать то, что я пытаюсь, без использования sourceSets, скажите мне!


person Thibaut D.    schedule 02.09.2015    source источник
comment
Я пытаюсь найти решение на основе project(path: ':Jserial', configuration: 'customConfig'), но пока не работает.   -  person Thibaut D.    schedule 02.09.2015


Ответы (1)


Я наконец нашел решение, которое считаю элегантным. Вместо sourceSets я использовал мульти-проект. Вот мой проект:

Serial/
  build.gradle
  src/main/java/com.package/
    SerialPort.java
  windows/
    build.gradle
    src/main/java/com.package/
      SerialPortWindows.java

Application/
  build.gradle
  settings.gradle

In my Application's settings.gradle:

includeFlat 'Serial'
includeFlat 'Serial/windows'

In my Application's build.gradle:

dependencies {
     project(':Serial/windows')
}

В моем Serial/windows build.gradle (для компиляции которого требуется интерфейс SerialPort):

dependencies {
     project(':Serial')
}

Затем, когда я создаю свое приложение, ему требуется Serial/windows, а для этого требуется Serial. Думаю, я смогу определить несколько build.gradle файлов для своего приложения (например, один для Linux и один для Windows) с разными зависимостями.

person Thibaut D.    schedule 04.09.2015