如何在IntelliJ中屏蔽Java 9的拆分包编译错误?
我之前碰到过好几个类似的案例,本质是JDK9引入的模块系统(JPMS)对**拆分包(split package)**的严格限制,而Maven和你用的老版本IntelliJ在JDK9编译策略上没对齐——Maven默认还在走传统类路径的兼容模式,不会强制检查拆分包,而IDEA 2017.2.6可能直接启用了JPMS的严格校验,所以就出现了Maven构建正常但IDE报错的情况。下面给你几个靠谱的解决办法,按优先级推荐:
1. 调整IntelliJ编译参数,兼容拆分包
这是最快的临时解决办法,让IDE放宽对拆分包的检查:
- 打开
File → Settings → Build, Execution, Deployment → Compiler → Java Compiler - 在列表中找到你的项目模块,在Additional command line parameters中添加以下参数:
(把--add-modules ALL-MODULE-PATH --add-reads [你的模块名称]=ALL-UNNAMED --permit-illegal-access[你的模块名称]替换成你项目的实际模块名,比如根模块就填项目名) - 点击
Apply并重启IDE,再重新编译试试。
如果你的项目没有定义module-info.java(非模块化项目),还可以尝试更简单的配置:
- 打开
File → Project Structure → Modules → [你的模块] → Sources - 确保没有
module-info.java文件(如果有可以暂时删除,不需要模块化的话),然后把模块的语言级别设置为9。
2. 升级IntelliJ IDEA版本
IDEA 2017.2.6是2017年的老版本,对JDK9的模块系统支持非常不完善,后续的版本(比如2018.1及以后)针对JPMS做了大量兼容性优化,很多拆分包的问题会被自动处理,或者提供更直观的配置选项。如果条件允许,升级到较新的IDEA版本是最彻底的解决办法。
3. 统一Maven和IntelliJ的编译配置
让IntelliJ完全继承Maven的编译策略,避免两者行为不一致:
在你的pom.xml中添加maven-compiler-plugin的配置,明确指定JDK9的兼容编译参数:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <!-- 这个版本完全支持JDK9 --> <configuration> <source>9</source> <target>9</target> <compilerArgs> <arg>--add-modules=ALL-MODULE-PATH</arg> <arg>--permit-illegal-access</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
配置完成后,右键项目 → Maven → Reload Project,IntelliJ会自动同步Maven的编译配置,这样IDE的编译行为就和Maven保持一致了。
4. 针对性用--patch-module处理冲突(进阶方案)
如果上面的方法都无效,可以针对具体的冲突包用JPMS的--patch-module参数合并路径:
比如,假设lucene-misc.jar和lucene-sandbox.jar都定义了org.apache.lucene.util包,你可以在IDE的编译参数中添加:
--patch-module org.apache.lucene.misc=/path/to/lucene-sandbox.jar
不过这个方法需要你找到冲突JAR的具体路径,操作起来比较繁琐,适合特定场景下的精准修复。
内容的提问来源于stack exchange,提问作者Ivan dal Bosco

