亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Gradle 中編譯一個 JDK 8 項目 + 一個 JDK 9“模塊信息.java”

在 Gradle 中編譯一個 JDK 8 項目 + 一個 JDK 9“模塊信息.java”

肥皂起泡泡 2022-08-03 11:02:35
我正在開發一個針對JDK 8的Java庫,我正在使用OpenJDK 11在Gradle 5中構建它。為了瞄準JDK 8,我是javac的--release選項。但是,我也希望我的庫與JPMS兼容。換句話說:我想提供一個編譯的(斯蒂芬·科爾伯恩量表的選項3),module-info.class--release 9而其余的都是用 編譯的。--release 8斷續器build.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']) // *** org.javamodularity.moduleplugin sets for--module-pathcompileJava**目前還沒有Gradle DSL:#2510--releasesrc/main/java/module-info.java:module pl.tlinkowski.sample {  requires lombok;  exports pl.tlinkowski.sample;}src/main/java/pl/tlinkowski/sample/Sample.java:package pl.tlinkowski.sample;@lombok.Valuepublic class Sample {  int sample;}此 MCVE 編譯,但所有類(而不是僅)都采用 JDK 9 類格式 (v.53)。module-info.class其他構建工具我想做的當然是可能的:馬文例如ThreeTen-Extra(他們的方法歸結為:首先編譯所有內容,然后編譯除使用之外的所有內容)。--release 9module-info.java--release 8螞蟻例如,龍目島(他們的方法歸結為:在單獨的“源代碼集”中擁有 - 主源代碼集編譯,“模塊信息”源代碼集編譯)。module-info.java--release 8--release 9
查看完整描述

2 回答

?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

自 1.5.0 版起,Gradle Modules Plugin 現在支持此功能。


下面是一個工作代碼段:build.gradle


plugins {

    id 'java'

    id 'org.javamodularity.moduleplugin' version '1.5.0'

}


repositories {

    mavenCentral()

}


dependencies {

    compileOnly 'org.projectlombok:lombok:1.18.6'

}


modularity.mixedJavaRelease 8

好吧,我設法通過以下方式完成這項工作:


禁用org.javamodularity.moduleplugin

刪除自定義源代碼集(不是必需的)

添加自定義任務并將其設置為任務的類路徑(靈感來自此 Gradle 手冊compileModuleInfoJava--module-pathcompileJava)

以下是的完整源代碼:build.gradle


plugins {

    id 'java'

}


repositories {

    mavenCentral()

}


dependencies {

    compileOnly 'org.projectlombok:lombok:1.18.6'

}


compileJava {

    exclude 'module-info.java'


    options.compilerArgs = ['--release', '8']

}


task compileModuleInfoJava(type: JavaCompile) {

    classpath = files() // empty

    source = 'src/main/java/module-info.java'

    destinationDir = compileJava.destinationDir // same dir to see classes compiled by compileJava


    doFirst {

        options.compilerArgs = [

                '--release', '9',

                '--module-path', compileJava.classpath.asPath,

        ]

    }

}


compileModuleInfoJava.dependsOn compileJava

classes.dependsOn compileModuleInfoJava

筆記:

  • 它編譯 ??

  • 我驗證了 JDK 9 格式(第 8 個字節→ v.53),而其他類是 JDK 8 格式(第 8 個字節→ v.52) ??module-info.class0x350x34

  • 但是,禁用是不令人滿意的,因為這意味著測試將不再在模塊路徑上運行,等等。 ??org.javamodularity.moduleplugin


查看完整回答
反對 回復 2022-08-03
?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

我為此開發了一個Gradle插件:https://github.com/Glavo/module-info-compiler


我試過Gradle Modules插件,但是還有一些麻煩的問題,所以我開發了這個插件,一個專門用于編譯的編譯器。module-info.java


它不是通過調用javac來實現的。它是一個完整的編譯器,可以在Java 8上運行。它識別的語法,并根據它生成相應的文件。module-info.javamodule-info.class


它只檢查語法,實際上不檢查那些包,類或模塊,因此它可以在不配置任何模塊路徑的情況下工作。


這個Gradle插件已經為您處理了所有內容。對于包含 的 Java 8 項目,您只需要執行以下操作:module-info.java


plugins {

    id("java")

    id("org.glavo.compile-module-info-plugin") version "2.0"

}


tasks.compileJava {

    options.release.set(8)

}


查看完整回答
反對 回復 2022-08-03
  • 2 回答
  • 0 關注
  • 420 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號