How to make Multi-Release JAR Files with Gradle?

旧城冷巷雨未停 提交于 2019-12-20 17:42:04

问题


Java9 introduces with Multi-Release JARs.

Let's say that I have multimodule Gradle project using java8:

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

This is a common multi-module project in Gradle. Let's say I need MR-Jar for module1.

I can't add module1-java9 targeting Java9 because the base is on 8 - so far, both my Gradle and IntelliJ IDEA complains. Gradle is compiled with the java8, but I need to enable java9 runtime just for the module (don't know how); in IntelliJ IDEA I can set the java9 runtime for the module, but it gets overwritten every time when gradle config is reloaded.

Moreover, even if I add it somehow, I need to instruct module1 to 1) build second and 2) to include module1-java9. Here is a drawing of this situation:

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

Alternatively, this could be done under module1, having different sources: src and src-java9. but I doubt this would ever be accepted. Here is a drawing:

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

So far I only see that module1-java9 is a separate project (not a module) and that module1 simply calls the gradle there and takes the output. Yeah, it's gradle calling gradle :)))

Is there any developer-friendly way to do this?


回答1:


As mentioned in the comments on the question, this blog post and the associated example project describe how to create a multi-release JAR with Gradle.

In case the blog post or example project should go away, you may also refer to the following setup which was derived from the example project and tailored a bit to the setup that is given in the question (as far as details are provided).

Overview

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'


来源:https://stackoverflow.com/questions/47648533/how-to-make-multi-release-jar-files-with-gradle

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!