Tom*_*ski 5 java javac gradle java-9 java-module
我正在开发一个面向 JDK 8 的 Java 库,我正在使用 OpenJDK 11 在 Gradle 5 中构建它。为了面向 JDK 8,我是 javac 的--release选项。
但是,我也希望我的库与 JPMS 兼容。换句话说:
module-info.class编译--release 9(Stephen Colebourne's scale 中的选项 3 ),--release 8.构建.gradle:
plugins {
id 'java'
id 'org.javamodularity.moduleplugin' version '1.4.1' // *
}
repositories {
mavenCentral()
}
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.6'
}
compileJava.options.compilerArgs.addAll(['--release', '9']) // **
Run Code Online (Sandbox Code Playgroud)
*org.javamodularity.moduleplugin设置--module-path为compileJava
** 目前还没有 Gradle DSL --release:#2510
src/main/java/module-info.java:
plugins {
id 'java'
id 'org.javamodularity.moduleplugin' version '1.4.1' // *
}
repositories {
mavenCentral()
}
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.6'
}
compileJava.options.compilerArgs.addAll(['--release', '9']) // **
Run Code Online (Sandbox Code Playgroud)
src/main/java/pl/tlinkowski/sample/Sample.java:
module pl.tlinkowski.sample {
requires lombok;
exports pl.tlinkowski.sample;
}
Run Code Online (Sandbox Code Playgroud)
这个 MCVE 编译,但所有类(而不是 only module-info.class)都是 JDK 9 类格式(v.53)。
我想要做的当然是可能的:
--release 9,然后除了module-info.java用编译所有东西--release 8)。module-info.java一个单独的“源集”——主源集用 编译--release 8,“模块信息”源集用 编译--release 9)。我喜欢 Lombok 的方法,所以我build.gradle按如下方式操作源集:
sourceSets {
main { // all but module-info
java {
exclude 'module-info.java'
}
}
mainModuleInfo { // module-info only
java {
srcDirs = ['src/main/java']
outputDir = file("$buildDir/classes/java/main")
include 'module-info.java'
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我配置了一个任务依赖项并--release为两个编译任务添加了适当的选项:
classes.dependsOn mainModuleInfoClasses
compileJava.options.compilerArgs.addAll(['--release', '8'])
compileMainModuleInfoJava.options.compilerArgs.addAll(['--release', '9'])
Run Code Online (Sandbox Code Playgroud)
如果我现在编译,我会得到:
错误:包 lombok 不存在
所以我仍然不知道如何指示org.javamodularity.moduleplugin:
--module-path用于main--module-path的mainModuleInfo编辑:自版本1.5.0以来, Gradle Modules Plugin现在支持此功能。
\n\n这是一个工作build.gradle片段:
plugins {\n id \'java\'\n id \'org.javamodularity.moduleplugin\' version \'1.5.0\'\n}\n\nrepositories {\n mavenCentral()\n}\n\ndependencies {\n compileOnly \'org.projectlombok:lombok:1.18.6\'\n}\n\nmodularity.mixedJavaRelease 8\nRun Code Online (Sandbox Code Playgroud)\n\n好的,我设法通过以下方式使其工作:
\n\norg.javamodularity.moduleplugincompileModuleInfoJava任务并将其设置--module-path为任务的类路径compileJava(受到本 Gradle 手册的启发)这是完整的源代码build.gradle:
plugins {\n id \'java\'\n}\n\nrepositories {\n mavenCentral()\n}\n\ndependencies {\n compileOnly \'org.projectlombok:lombok:1.18.6\'\n}\n\ncompileJava {\n exclude \'module-info.java\'\n\n options.compilerArgs = [\'--release\', \'8\']\n}\n\ntask compileModuleInfoJava(type: JavaCompile) {\n classpath = files() // empty\n source = \'src/main/java/module-info.java\'\n destinationDir = compileJava.destinationDir // same dir to see classes compiled by compileJava\n\n doFirst {\n options.compilerArgs = [\n \'--release\', \'9\',\n \'--module-path\', compileJava.classpath.asPath,\n ]\n }\n}\n\ncompileModuleInfoJava.dependsOn compileJava\nclasses.dependsOn compileModuleInfoJava\nRun Code Online (Sandbox Code Playgroud)\n\n笔记:
\n\nmodule-info.class是 JDK 9 格式(第 8 个字节是0x35\xe2\x86\x92 v.53),而其他类是 JDK 8 格式(第 8 个字节是0x34\xe2\x86\x92 v.52)org.javamodularity.moduleplugin并不令人满意,因为这意味着测试将不再在模块路径等上运行。| 归档时间: |
|
| 查看次数: |
3485 次 |
| 最近记录: |