You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle多项目从Java 8分步迁移至Java 9的配置方案咨询

刚好做过这种分步迁移Gradle多项目到Java9的操作,给你详细说下怎么配置,完全适配你主模块用Java9、其他子模块留Java8的需求:

核心思路

你提到的自动模块方案完全可行——Java9的模块系统允许将未声明module-info.java的JAR(也就是你的Java8子模块)作为自动模块纳入模块路径。Gradle已经内置了对这种场景的支持,不需要额外插件,只要调整几个关键配置就行。

具体配置步骤

1. 全局默认配置(顶层build.gradle)

先给所有子模块设置默认的Java8版本,只让主模块单独覆盖成Java9:

allprojects {
    repositories {
        mavenCentral()
    }
}

subprojects {
    plugins.withId('java') {
        java {
            sourceCompatibility = JavaVersion.VERSION_1_8
            targetCompatibility = JavaVersion.VERSION_1_8
        }
    }
}

2. 主模块Java9配置

假设你的主模块是:main-app,在它的build.gradle里启用Java9和模块系统:

plugins {
    id 'java'
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_9
    targetCompatibility = JavaVersion.VERSION_1_9
    // 开启模块路径自动推断,这是让Java8子模块变成自动模块的关键
    modularity.inferModulePath = true
}

dependencies {
    // 依赖你的Java8子模块,比如`:common-utils`
    implementation project(':common-utils')
}

3. 主模块的module-info.java

在主模块的src/main/java下创建module-info.java,声明对自动模块的依赖:

module com.example.mainapp {
    // 这里的模块名默认是子模块JAR的basename(比如common-utils会转为common.utils)
    requires common.utils;
}
优化:自定义自动模块名称(可选)

默认情况下,自动模块的名称是子模块JAR的文件名(去掉版本号,把连字符换成点)。如果想更规范地指定模块名,可以在Java8子模块的build.gradle里添加Manifest属性:

jar {
    manifest {
        attributes 'Automatic-Module-Name': 'com.example.common.utils'
    }
}

之后主模块的module-info.java就要改成:

module com.example.mainapp {
    requires com.example.common.utils;
}
注意事项
  • 确保主模块的module-info.java正确声明依赖,否则编译时会出现找不到类的错误。
  • Gradle会自动处理模块路径和类路径的兼容,Java9允许主模块使用模块系统,同时依赖的自动模块会被自动放到模块路径上。
  • 如果你的Java8子模块依赖第三方JAR,这些JAR也会被Gradle自动识别为自动模块,不需要额外配置。

内容的提问来源于stack exchange,提问作者magicroomy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:25:39