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
相关产品推荐
相关产品推荐

