Как сделать файлы с несколькими версиями JAR с помощью Gradle?

Java9 представляет Multi-Release JAR.

Скажем, что у меня есть многомодульный проект Gradle с использованием java8:

project-root
      settings.gradle
      build.gradle 
      /module1
          /src
          ... (common maven structure)
      /module2
      /module3

Это общий многомодульный проект в Gradle. Скажем, мне нужен MR-Jar для module1.

Я не могу добавить module1-java9 таргетинг на Java9, потому что база находится на 8 - до сих пор, как мои Gradle, так и IntelliJ IDEA жалуются. Gradle скомпилирован с java8, но мне нужно включить java9 runtime только для модуля (не знаю, как); в IntelliJ IDEA я могу установить время выполнения java9 для модуля, но он перезаписывается каждый раз при перезагрузке Gradle.

Кроме того, даже если я его каким-то образом добавлю, мне нужно проинструктировать module1 1) построить второй и 2) включить module1-java9. Вот пример этой ситуации:

project-root
      settings.gradle
      build.gradle 
      /module1
      /module1-java9  (added java9 module)
      /module2
      ...

В качестве альтернативы это можно сделать в module1, имеющем разные источники: src и src-java9. но я сомневаюсь, что это когда-нибудь будет принято. Вот чертеж:

project-root
      settings.gradle
      build.gradle 
      /module1
          /src
          /src-java9 (added java9 source folder)
      /module2
      /module3

До сих пор я вижу только, что module1-java9 является отдельным проектом (а не модулем) и что module1 просто вызывает Gradle там и выводит результат. Да, это Gradle вызов Gradle:)))

Есть ли какой-нибудь удобный для разработчиков способ?

Ответ 1

Как упоминалось в комментариях к вопросу, в этом блоге и связанном с ним примере проекта описывается, как создать JAR с несколькими выпусками с Gradle.

В случае, если публикация в блоге или пример проекта исчезнут, вы также можете обратиться к следующей настройке, которая была получена из примера проекта и немного адаптирована к настройке, приведенной в вопросе (если предоставлена подробная информация).

Обзор

project-root/
├── build.gradle
├── module1
│   └── src
│       └── main
│           ├── java
│           │   └── com
│           │       └── acme
│           │           ├── JdkSpecific.java
│           │           └── Shared.java
│           └── java9
│               └── com
│                   └── acme
│                       └── JdkSpecific.java
├── module2
│   └── whatever
├── module3
│   └── whatever
└── settings.gradle

build.gradle

allprojects {
    apply plugin: 'java'

    compileJava {
        sourceCompatibility = 8
        targetCompatibility = 8
    }
}

dependencies {
    implementation project(':module1')
}

project(':module1') {
    sourceSets {
        java9 {
            java {
                srcDirs = ['src/main/java9']
            }
        }
    }

    compileJava9Java {
        sourceCompatibility = 9
        targetCompatibility = 9
    }

    dependencies {
        java9Implementation files(sourceSets.main.output.classesDirs) {
                builtBy compileJava
            }
    }

    jar {
        into('META-INF/versions/9') {
            from sourceSets.java9.output
        }
        manifest.attributes('Multi-Release': 'true')
    }
}

settings.gradle

include 'module1', 'module2', 'module3'