IntelliJ中vertx-hk2与vertx-jersey的Java 9拆分包问题求助
解决Java 9迁移中vertx-hk2与vertx-jersey拆分包导致IntelliJ启动失败的问题
我之前在迁移Java 9项目时也碰到过类似的拆分包冲突问题,尤其是IntelliJ的模块处理逻辑和打包后的fat.jar不一致的情况,给你几个针对性的解决方案:
方案一:调整IntelliJ依赖配置,允许重复类
IntelliJ默认会严格检查模块路径中的重复类,这和fat.jar打包时合并类的逻辑不同,你可以手动修改依赖设置:
- 打开
File > Project Structure > Modules,找到你的主业务模块 - 切换到
Dependencies标签页,找到vertx-hk2和vertx-jersey这两个依赖 - 右键点击其中一个依赖,选择
Edit,在弹出的窗口里勾选Allow duplicate classes选项 - 对另一个依赖执行同样的操作,之后重启IntelliJ再尝试启动项目
方案二:让IntelliJ复用Maven/Gradle的构建配置
如果之前尝试过--patch-module参数但在IntelliJ里不生效,可能是因为IDE没有使用构建工具的配置。可以这样设置:
Maven项目
- 在
pom.xml中添加编译插件的--patch-module配置,把两个冲突的jar包合并到同一个模块下:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <release>9</release> <compilerArgs> <arg>--patch-module</arg> <arg>com.englishtown.vertx.hk2=${project.basedir}/target/dependency/vertx-hk2-xxx.jar</arg> <arg>--patch-module</arg> <arg>com.englishtown.vertx.hk2=${project.basedir}/target/dependency/vertx-jersey-xxx.jar</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
- 打开IntelliJ的
File > Settings > Build, Execution, Deployment > Build Tools > Maven > Runner,勾选Delegate IDE build/run actions to Maven - 之后运行项目时,IntelliJ会调用Maven的构建逻辑,自动应用
--patch-module参数
Gradle项目
在build.gradle中添加类似的模块补丁配置:
tasks.withType(JavaCompile) { options.compilerArgs += [ '--patch-module', 'com.englishtown.vertx.hk2=' + fileTree(dir: 'libs', include: 'vertx-hk2-xxx.jar').asPath, '--patch-module', 'com.englishtown.vertx.hk2=' + fileTree(dir: 'libs', include: 'vertx-jersey-xxx.jar').asPath ] }
然后同样开启Delegate IDE build/run actions to Gradle选项。
方案三:升级依赖版本
很多老的Vert.x生态库在后续版本中已经适配了Java 9的模块系统,可能已经解决了拆分包问题。你可以去Maven中央仓库查询vertx-hk2和vertx-jersey的最新稳定版本,替换项目中的依赖后再测试。
方案四:自定义module-info.java声明
如果你的项目已经使用了Java模块系统,可以在module-info.java中明确处理冲突:
module your.project.module { // 声明依赖两个库的模块 requires com.englishtown.vertx.hk2; requires com.englishtown.vertx.jersey; // 允许两个库访问你的业务包(如果需要的话) opens com.your.project.package to com.englishtown.vertx.hk2, com.englishtown.vertx.jersey; }
注意要确认两个库的模块名称是否正确,可以查看jar包内的module-info.java或者MANIFEST.MF文件中的Automatic-Module-Name字段。
最后一招:清理IntelliJ缓存
如果以上方法都无效,可能是IDE缓存导致的异常。尝试File > Invalidate Caches... > Invalidate and Restart,清理缓存后再重新导入项目。
内容的提问来源于stack exchange,提问作者Eric Nascimento
相关产品推荐
相关产品推荐

