Java9引入了Multi-Release JARs。
让我们说我有使用java8的多模块Gradle项目:
project-root
settings.gradle
build.gradle
/module1
/src
... (common maven structure)
/module2
/module3
这是Gradle中常见的多模块项目。我们说module1
需要MR-Jar。
我无法添加module1-java9
定位Java9,因为基础是8 - 到目前为止,我的Gradle和IntelliJ IDEA都抱怨。 Gradle是用java8编译的,但我需要为模块启用java9运行时(不知道如何);在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:)))
有没有开发人员友好的方式来做到这一点?
答案 0 :(得分:1)
如对问题的评论中所述,this blog post和相关的example project描述了如何使用Gradle创建多发行版JAR。
万一博客文章或示例项目不见了,您还可以参考以下示例项目中的设置,该设置是从示例项目中派生而来,并针对问题中给出的设置进行了一些调整(就提供的详细信息而言) )。
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'